From 1d5a829f88b518fa28aca47922747694a7cfa0c4 Mon Sep 17 00:00:00 2001 From: kwaroran Date: Mon, 27 May 2024 11:18:15 +0900 Subject: [PATCH] feat: Add custom toggles --- src/lang/en.ts | 4 +++- src/lib/Setting/Pages/PromptSettings.svelte | 3 +++ src/lib/SideBars/CharConfig.svelte | 9 +++++++++ src/lib/SideBars/SideChatList.svelte | 15 ++++++++++++--- src/ts/parser.ts | 8 ++++++++ src/ts/process/prompt.ts | 19 +++++++++++++++++++ src/ts/storage/database.ts | 10 ++++++++-- 7 files changed, 62 insertions(+), 6 deletions(-) diff --git a/src/lang/en.ts b/src/lang/en.ts index fd8a2513..6196f4bc 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -127,6 +127,7 @@ export const languageEnglish = { nickname: "Nickname would used be in {{char}} or in chat instead of character's name if it is set.", useRegexLorebook: "If enabled, it will use regex for lorebook search, instead of string matching. it uses /regex/flags format.", customChainOfThought: "Warning: chain of thought toggle is no longer recommended to use. put chain of thought prompt in other prompt entries instead.", + customPromptTemplateToggle: "Here you can define your own prompt toggles. use `=` format, seperated by newline. for example, `cot=Toggle COT`. you can use these toggles in prompt by using `{{getglobalvar::toggle_}}`. like `{{getglobalvar::toggle_cot}}`.", }, setup: { chooseProvider: "Choose AI Provider", @@ -608,5 +609,6 @@ export const languageEnglish = { risupresetDesc: "Risupreset format is a format specifically designed for RisuAI presets.", jsonDesc: "JSON format is a format that is easy to read and write for both humans and machines.", nickname: "Nickname", - useRegexLorebook: "Use Regex" + useRegexLorebook: "Use Regex", + customPromptTemplateToggle: "Custom Toggles", } \ No newline at end of file diff --git a/src/lib/Setting/Pages/PromptSettings.svelte b/src/lib/Setting/Pages/PromptSettings.svelte index 3bd99242..82daa42b 100644 --- a/src/lib/Setting/Pages/PromptSettings.svelte +++ b/src/lib/Setting/Pages/PromptSettings.svelte @@ -9,6 +9,7 @@ import TextInput from "src/lib/UI/GUI/TextInput.svelte"; import NumberInput from "src/lib/UI/GUI/NumberInput.svelte"; import Help from "src/lib/Others/Help.svelte"; + import TextAreaInput from "src/lib/UI/GUI/TextAreaInput.svelte"; let sorted = 0 let opened = 0 @@ -117,4 +118,6 @@ {/if} {language.maxThoughtTagDepth} + {language.customPromptTemplateToggle} + {/if} \ No newline at end of file diff --git a/src/lib/SideBars/CharConfig.svelte b/src/lib/SideBars/CharConfig.svelte index 0da9a0bc..f0fa3055 100644 --- a/src/lib/SideBars/CharConfig.svelte +++ b/src/lib/SideBars/CharConfig.svelte @@ -29,6 +29,7 @@ import { updateInlayScreen } from "src/ts/process/inlayScreen"; import { registerOnnxModel } from "src/ts/process/transformers"; import MultiLangInput from "../UI/GUI/MultiLangInput.svelte"; + import { getCustomToggles } from "src/ts/process/prompt"; let subMenu = 0 @@ -246,6 +247,14 @@
+ + {#each getCustomToggles($DataBase.customPromptTemplateToggle) as toggle} +
+ { + $DataBase.globalChatVariables[`toggle_${toggle[0]}`] = $DataBase.globalChatVariables[`toggle_${toggle[0]}`] === '1' ? '0' : '1' + }} /> +
+ {/each} {#if $DataBase.supaMemoryType !== 'none' || $DataBase.hanuraiEnable} {#if $DataBase.hanuraiEnable} diff --git a/src/lib/SideBars/SideChatList.svelte b/src/lib/SideBars/SideChatList.svelte index acae9fd1..abc3474d 100644 --- a/src/lib/SideBars/SideChatList.svelte +++ b/src/lib/SideBars/SideChatList.svelte @@ -2,7 +2,7 @@ import type { character, groupChat } from "src/ts/storage/database"; import { DataBase } from "src/ts/storage/database"; import TextInput from "../UI/GUI/TextInput.svelte"; - import { DownloadIcon, EditIcon, FolderUpIcon, MenuIcon, TrashIcon } from "lucide-svelte"; + import { DownloadIcon, PencilIcon, FolderUpIcon, MenuIcon, TrashIcon } from "lucide-svelte"; import { exportChat, importChat } from "src/ts/characters"; import { alertConfirm, alertError, alertSelect } from "src/ts/alert"; import { language } from "src/lang"; @@ -11,6 +11,7 @@ import CheckInput from "../UI/GUI/CheckInput.svelte"; import { createMultiuserRoom } from "src/ts/sync/multiuser"; import { CurrentCharacter } from "src/ts/stores"; + import { getCustomToggles } from "src/ts/process/prompt"; export let chara:character|groupChat let editMode = false @@ -62,7 +63,7 @@ @@ -110,6 +111,14 @@ + {#each getCustomToggles($DataBase.customPromptTemplateToggle) as toggle} +
+ { + $DataBase.globalChatVariables[`toggle_${toggle[0]}`] = $DataBase.globalChatVariables[`toggle_${toggle[0]}`] === '1' ? '0' : '1' + }} /> +
+ {/each} + {#if $DataBase.supaMemoryType !== 'none' || $DataBase.hanuraiEnable} {#if $DataBase.hanuraiEnable}
diff --git a/src/ts/parser.ts b/src/ts/parser.ts index fa74f38d..02600576 100644 --- a/src/ts/parser.ts +++ b/src/ts/parser.ts @@ -783,6 +783,9 @@ const matcher = (p1:string,matcherArg:matcherArg) => { } return null } + case 'getglobalvar':{ + return getGlobalChatVar(v) + } case 'button':{ return `` } @@ -1461,6 +1464,11 @@ export function getChatVar(key:string){ return (chat.scriptstate['$' + key])?.toString() ?? 'null' } +export function getGlobalChatVar(key:string){ + const db = get(DataBase) + return db.globalChatVariables[key] ?? 'null' +} + export function setChatVar(key:string, value:string){ const db = get(DataBase) const selectedChar = get(selectedCharID) diff --git a/src/ts/process/prompt.ts b/src/ts/process/prompt.ts index 1989d009..1998eda6 100644 --- a/src/ts/process/prompt.ts +++ b/src/ts/process/prompt.ts @@ -1,4 +1,6 @@ +import { get } from "svelte/store"; import { tokenizeAccurate } from "../tokenizer"; +import type { Database } from "../storage/database"; export type PromptItem = PromptItemPlain|PromptItemTyped|PromptItemChat|PromptItemAuthorNote; export type PromptType = PromptItem['type']; @@ -61,4 +63,21 @@ export async function tokenizePreset(prompts:PromptItem[], consti:boolean = fals } } return total +} + +export function getCustomToggles(template:string){ + if(!template){ + return [] + } + + const keyValue:[string, string][] = [] + + for(const line of template.split('\n')){ + const [key, value] = line.split('=') + if(key && value){ + keyValue.push([key, value]) + } + } + + return keyValue } \ No newline at end of file diff --git a/src/ts/storage/database.ts b/src/ts/storage/database.ts index d6906565..059b3549 100644 --- a/src/ts/storage/database.ts +++ b/src/ts/storage/database.ts @@ -400,6 +400,8 @@ export function setDatabase(data:Database){ data.sideBarSize ??= 0 data.textAreaTextSize ??= 0 data.combineTranslation ??= false + data.customPromptTemplateToggle ??= '' + data.globalChatVariables ??= {} changeLanguage(data.language) DataBase.set(data) @@ -657,7 +659,8 @@ export interface Database{ combineTranslation:boolean dynamicAssets:boolean dynamicAssetsEditDisplay:boolean - + customPromptTemplateToggle:string + globalChatVariables:{[key:string]:string} } export interface customscript{ @@ -878,6 +881,7 @@ export interface botPreset{ top_a?:number openrouterProvider?:string useInstructPrompt?:boolean + customPromptTemplateToggle?:string } @@ -1144,7 +1148,8 @@ export function saveCurrentPreset(){ min_p: db.min_p, top_a: db.top_a, openrouterProvider: db.openrouterProvider, - useInstructPrompt: db.useInstructPrompt + useInstructPrompt: db.useInstructPrompt, + customPromptTemplateToggle: db.customPromptTemplateToggle ?? "" } db.botPresets = pres setDatabase(db) @@ -1227,6 +1232,7 @@ export function setPreset(db:Database, newPres: botPreset){ db.top_a = newPres.top_a db.openrouterProvider = newPres.openrouterProvider db.useInstructPrompt = newPres.useInstructPrompt ?? false + db.customPromptTemplateToggle = newPres.customPromptTemplateToggle ?? '' return db }