diff --git a/src/lang/en.ts b/src/lang/en.ts index 01da7459..6ed2f431 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -54,7 +54,7 @@ export const languageEnglish = { regexScript: "Regex Script is a custom script that is embbedded to the character. it replaces string that matches IN to OUT.\n\nThere are three type options." + "- **Modify Input** modifys user's input" + "- **Modify Output** modifys character's output" - + "- **Modify Request Data** modifys current chat data when sent.\n\nIN must be a regex without flags and without backslashes in start and end.\n\nOUT is a normal string." + + "- **Modify Request Data** modifys current chat data when sent.\n\nIN must be a regex without flags and without slashes in start and end.\n\nOUT is a normal string." + "\n\n If OUT has {{data}} in string, it replaces to matched string." + "\n\n If OUT starts with **@@**, it doesn't replaces the string, but instead does a special effect if matching string founds." + "\n\n- @@emo (emotion name)\n\n if character is Emotion Images mode, sets (emotion name) as emotion and prevents default.", @@ -70,7 +70,8 @@ export const languageEnglish = { chatNote: "a note that strongly effects model behavior. embbedded to current chat. also known as memory.", personality: "A brief description about character's personality. \n\n**It is not recommended to use this option. Describe it in character description instead.**", scenario: "A brief description about character's scenario. \n\n**It is not recommended to use this option. Describe it in character description instead.**", - utilityBot: "When activated, it ignores main prompt. \n\n**It is not recommended to use this option. Modifiy system prompt instead.**" + utilityBot: "When activated, it ignores main prompt. \n\n**It is not recommended to use this option. Modifiy system prompt instead.**", + loreSelective: "If Selective mode is toggled, both Activation Key and Secondary key should have a match to activate the lore." }, setup: { @@ -233,5 +234,10 @@ export const languageEnglish = { unrecommended: "Not Recommended", chatNotes: "Chat Notes", showUnrecommended: "Show Unrecommended Settings", - altGreet: "Alternative First Messages" + altGreet: "Alternative First Messages", + scripts: "Scripts", + settings: "Settings", + selective: "Selective", + SecondaryKeys: 'Secondary keys', + } diff --git a/src/lang/ko.ts b/src/lang/ko.ts index 428daccf..68d1e12a 100644 --- a/src/lang/ko.ts +++ b/src/lang/ko.ts @@ -183,7 +183,7 @@ export const languageKorean = { regexScript: "정규식 스크립트는 캐릭터에 종속된 커스텀 스크립트입니다. IN의 조건에 맞는 문자열을 OUT으로 변경합니다.\n\n타입은 세가지가 있습니다." + "- **입력문 수정** 유저의 입력문을 수정합니다" + "- **출력문 수정** 캐릭터의 출력문을 수정합니다" - + "- **리퀘스트 데이터 수정** 리퀘스트를 보낼 때 채팅 데이터를 수정합니다.\n\nIN은 flag가 없고, 양끝에 백슬레시가 없는 Regex여야 합니다.\n\nOUT은 일반 문자열입니다." + + "- **리퀘스트 데이터 수정** 리퀘스트를 보낼 때 채팅 데이터를 수정합니다.\n\nIN은 flag가 없고, 양끝에 슬레시가 없는 Regex여야 합니다.\n\nOUT은 일반 문자열입니다." + "\n\n 만약 OUT 문자열에 {{data}}가 있으면, 매칭된 문자열로 바뀝니다." + "\n\n 만약 OUT이 @@로 시작된다면, 특수한 효과를 냅니다" + "\n\n- @@emo (emotion name)\n\n 감정 이미지 모드일 시 (emotion name)을 감정으로 정하고 감정 처리를 하지 않습니다.", diff --git a/src/lib/SideBars/CharConfig.svelte b/src/lib/SideBars/CharConfig.svelte index ceb3b73f..6244dcfb 100644 --- a/src/lib/SideBars/CharConfig.svelte +++ b/src/lib/SideBars/CharConfig.svelte @@ -3,7 +3,7 @@ import { tokenize } from "../../ts/tokenizer"; import { DataBase, type Database, type character, type groupChat } from "../../ts/database"; import { selectedCharID } from "../../ts/stores"; - import { PlusIcon, SmileIcon, TrashIcon, UserIcon, ActivityIcon, BookIcon, LoaderIcon, User } from 'lucide-svelte' + import { PlusIcon, SmileIcon, TrashIcon, UserIcon, ActivityIcon, BookIcon, LoaderIcon, User, DnaIcon, CurlyBracesIcon } from 'lucide-svelte' import Check from "../Others/Check.svelte"; import { addCharEmotion, addingEmotion, getCharImage, rmCharEmotion, selectCharImg, makeGroupImage } from "../../ts/characters"; import LoreBook from "./LoreBookSetting.svelte"; @@ -156,6 +156,11 @@ + {#if currentChar.type === 'character'} + + {/if} @@ -370,32 +375,9 @@ {:else if subMenu === 3}

{language.loreBook}

-{:else if subMenu === 2} -

{language.advancedSettings}

- {#if currentChar.type !== 'group'} - {language.exampleMessage} - - - {language.creatorNotes} - - - {language.systemPrompt} - - - {language.chatNotes} - - {tokens.localNote} {language.tokens} - - {#if $DataBase.showUnrecommended || currentChar.data.personality.length > 3} - {language.personality} - - {/if} - {#if $DataBase.showUnrecommended || currentChar.data.scenario.length > 3} - {language.scenario} - - {/if} +{:else if subMenu === 4} + {#if currentChar.type === 'character'} +

{language.scripts}

Bias @@ -432,8 +414,64 @@ }}> {/each} +
+ {language.regexScript} + + {#if currentChar.data.customscript.length === 0} +
No Scripts
+ {/if} + {#each currentChar.data.customscript as customscript, i} + { + if(currentChar.type === 'character'){ + let customscript = currentChar.data.customscript + customscript.splice(i, 1) + currentChar.data.customscript = customscript + } + }}/> + {/each} +
+ + {/if} +{:else if subMenu === 2} +

{language.advancedSettings}

+ {#if currentChar.type !== 'group'} + {language.exampleMessage} + + + {language.creatorNotes} + + + {language.systemPrompt} + + + {language.chatNotes} + + {tokens.localNote} {language.tokens} + + {#if $DataBase.showUnrecommended || currentChar.data.personality.length > 3} + {language.personality} + + {/if} + {#if $DataBase.showUnrecommended || currentChar.data.scenario.length > 3} + {language.scenario} + + {/if} + {language.altGreet} @@ -476,33 +514,6 @@ {/each}
- {language.regexScript} - - {#if currentChar.data.customscript.length === 0} -
No Scripts
- {/if} - {#each currentChar.data.customscript as customscript, i} - { - if(currentChar.type === 'character'){ - let customscript = currentChar.data.customscript - customscript.splice(i, 1) - currentChar.data.customscript = customscript - } - }}/> - {/each} -
- {#if $DataBase.showUnrecommended || currentChar.data.utilityBot}
diff --git a/src/lib/SideBars/LoreBookData.svelte b/src/lib/SideBars/LoreBookData.svelte index fcd6c5aa..33f9846b 100644 --- a/src/lib/SideBars/LoreBookData.svelte +++ b/src/lib/SideBars/LoreBookData.svelte @@ -13,6 +13,7 @@
diff --git a/src/lib/SideBars/LoreBookSetting.svelte b/src/lib/SideBars/LoreBookSetting.svelte index dc63536f..08cdc644 100644 --- a/src/lib/SideBars/LoreBookSetting.svelte +++ b/src/lib/SideBars/LoreBookSetting.svelte @@ -3,7 +3,7 @@ import { language } from "../../lang"; import {selectedCharID} from '../../ts/stores' import { DownloadIcon, FolderUpIcon, ImportIcon, PlusIcon } from "lucide-svelte"; - import { addLorebook, exportLoreBook, importLoreBook } from "../../ts/lorebook"; + import { addLorebook, exportLoreBook, importLoreBook } from "../../ts/process/lorebook"; import LoreBookData from "./LoreBookData.svelte"; let submenu = 0 @@ -19,6 +19,11 @@ }} class="flex-1 border-solid border-borderc border-1 border-l-transparent p-2 flex justify-center cursor-pointer" class:bg-selected={submenu === 1}> {language.Chat} +
{submenu === 0 ? $DataBase.characters[$selectedCharID].type === 'group' ? language.groupLoreInfo : language.globalLoreInfo : language.localLoreInfo} diff --git a/src/ts/database.ts b/src/ts/database.ts index 4075fbb7..7d11c9a4 100644 --- a/src/ts/database.ts +++ b/src/ts/database.ts @@ -216,11 +216,13 @@ export interface customscript{ export interface loreBook{ key:string + secondkey:string insertorder: number comment: string content: string mode: 'multiple'|'constant'|'normal', alwaysActive: boolean + selective:boolean } export interface character{ diff --git a/src/ts/process/index.ts b/src/ts/process/index.ts index a68511d0..8b18b3c1 100644 --- a/src/ts/process/index.ts +++ b/src/ts/process/index.ts @@ -4,7 +4,7 @@ import { CharEmotion, selectedCharID } from "../stores"; import { tokenize, tokenizeNum } from "../tokenizer"; import { language } from "../../lang"; import { alertError } from "../alert"; -import { loadLoreBookPrompt } from "../lorebook"; +import { loadLoreBookPrompt } from "./lorebook"; import { findCharacterbyId, replacePlaceholders } from "../util"; import { requestChatData } from "./request"; import { stableDiff } from "./stableDiff"; diff --git a/src/ts/lorebook.ts b/src/ts/process/lorebook.ts similarity index 79% rename from src/ts/lorebook.ts rename to src/ts/process/lorebook.ts index 6a0a0770..ec183109 100644 --- a/src/ts/lorebook.ts +++ b/src/ts/process/lorebook.ts @@ -1,11 +1,11 @@ import { get } from "svelte/store"; -import {selectedCharID} from './stores' -import { DataBase, setDatabase, type loreBook } from "./database"; -import { tokenize } from "./tokenizer"; -import { selectSingleFile } from "./util"; -import { alertError, alertNormal } from "./alert"; -import { language } from "../lang"; -import { downloadFile } from "./globalApi"; +import {selectedCharID} from '../stores' +import { DataBase, setDatabase, type loreBook } from "../database"; +import { tokenize } from "../tokenizer"; +import { selectSingleFile } from "../util"; +import { alertError, alertNormal } from "../alert"; +import { language } from "../../lang"; +import { downloadFile } from "../globalApi"; export function addLorebook(type:number) { let selectedID = get(selectedCharID) @@ -17,7 +17,9 @@ export function addLorebook(type:number) { content: '', mode: 'normal', insertorder: 100, - alwaysActive: false + alwaysActive: false, + secondkey: "", + selective: false }) } else{ @@ -28,14 +30,17 @@ export function addLorebook(type:number) { content: '', mode: 'normal', insertorder: 100, - alwaysActive: false + alwaysActive: false, + secondkey: "", + selective: false }) } setDatabase(db) } interface formatedLore{ - keys:string[]|'always' + keys:string[]|'always', + secondKey:string[] content: string order: number } @@ -61,6 +66,9 @@ export async function loadLoreBookPrompt(){ keys: lore.alwaysActive ? 'always' : lore.key.replace(rmRegex, '').toLocaleLowerCase().split(',').filter((a) => { return a.length > 1 }), + secondKey: lore.selective ? lore.secondkey.replace(rmRegex, '').toLocaleLowerCase().split(',').filter((a) => { + return a.length > 1 + }) : [], content: lore.content, order: lore.insertorder }) @@ -86,7 +94,20 @@ export async function loadLoreBookPrompt(){ continue } + let firstKeyActivation = false for(const key of lore.keys){ + if(formatedChat.includes(key)){ + firstKeyActivation = true + break + } + } + + if(firstKeyActivation && lore.secondKey.length === 0){ + activatiedPrompt.push(lore.content) + continue + } + + for(const key of lore.secondKey){ if(formatedChat.includes(key)){ activatiedPrompt.push(lore.content) break @@ -129,10 +150,12 @@ export async function importLoreBook(mode:'global'|'local'){ lore.push({ key: currentLore.key.join(', '), insertorder: currentLore.order, - comment: currentLore.comment.length < 1 ? 'Unnamed Imported Lore': currentLore.comment, + comment: currentLore.comment.length < 1 ? 'Unnamed Imported Lore' : currentLore.comment, content: currentLore.content, mode: "normal", - alwaysActive: currentLore.constant + alwaysActive: currentLore.constant, + secondkey: "", + selective: false }) } }