diff --git a/src/lang/en.ts b/src/lang/en.ts index 63f9ae80..2ce2e9d3 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -93,7 +93,8 @@ export const languageEnglish = { replaceGlobalNote: "If its not blank, it replaces current global note to this.", backgroundHTML: "A Markdown/HTML Data that would be injected to the background of chat screen.\n\n you can also use additional assets. for example, you can use `{{audio::}}`: inject the background as asset" + + "\n - `{{bg::}}`: inject the background as asset", + additionalText: "The text that would be added to Character Description only when ai thinks its needed, so you can put long texts here. seperate with double newlines.", }, setup: { chooseProvider: "Choose AI Provider", @@ -435,4 +436,5 @@ export const languageEnglish = { appendNameNAI: "Append Name on NAI", customStopWords: "Custom Stop Words", defaultPrompt: "Default Prompt", + additionalText: 'Additional Description', } \ No newline at end of file diff --git a/src/lib/SideBars/CharConfig.svelte b/src/lib/SideBars/CharConfig.svelte index 26b1fbfd..c1e91178 100644 --- a/src/lib/SideBars/CharConfig.svelte +++ b/src/lib/SideBars/CharConfig.svelte @@ -611,6 +611,9 @@ {language.replaceGlobalNote} + {language.additionalText} + + {#if currentChar.data.chats[currentChar.data.chatPage].supaMemoryData && currentChar.data.chats[currentChar.data.chatPage].supaMemoryData.length > 4} {language.SuperMemory} diff --git a/src/ts/characterCards.ts b/src/ts/characterCards.ts index e11c6abc..01f25b11 100644 --- a/src/ts/characterCards.ts +++ b/src/ts/characterCards.ts @@ -185,6 +185,7 @@ function convertOldTavernAndJSON(charaData:OldTavernChar, imgp:string|undefined firstMsgIndex: -1, replaceGlobalNote: "", triggerscript: [], + additionalText: '' } } @@ -346,7 +347,8 @@ async function importSpecv2(card:CharacterCardV2, img?:Uint8Array, mode?:'hub'|' backgroundHTML: data?.extensions?.risuai?.backgroundHTML, license: data?.extensions?.risuai?.license, triggerscript: data?.extensions?.risuai?.triggerscript ?? [], - private: data?.extensions?.risuai?.private ?? false + private: data?.extensions?.risuai?.private ?? false, + additionalText: data?.extensions?.risuai?.additionalText ?? '', } db.characters.push(char) @@ -424,7 +426,10 @@ async function createBaseV2(char:character) { sdData: char.sdData, additionalAssets: char.additionalAssets, backgroundHTML: char.backgroundHTML, - license: char.license + license: char.license, + triggerscript: char.triggerscript, + additionalText: char.additionalText + } } } @@ -463,6 +468,7 @@ export async function exportSpecV2(char:character, type:'png'|'json' = 'png') { } } + if(type === 'json'){ await downloadFile(`${char.name.replace(/[<>:"/\\|?*\.\,]/g, "")}_export.json`, Buffer.from(JSON.stringify(card, null, 4), 'utf-8')) alertNormal(language.successExport) @@ -693,6 +699,7 @@ type CharacterCardV2 = { license?:string, triggerscript?:triggerscript[] private?:boolean + additionalText?:string } } } diff --git a/src/ts/characters.ts b/src/ts/characters.ts index 573116df..e86696ad 100644 --- a/src/ts/characters.ts +++ b/src/ts/characters.ts @@ -289,6 +289,7 @@ export function characterFormatUpdate(index:number|character){ cha.chats[cha.chatPage].note = cha.chats[cha.chatPage].note.trim() cha.postHistoryInstructions = null } + cha.additionalText ??= '' } else{ @@ -350,7 +351,8 @@ export function createBlankChar():character{ scenario:"", firstMsgIndex: -1, replaceGlobalNote: "", - triggerscript: [] + triggerscript: [], + additionalText: '' } } diff --git a/src/ts/process/embedding/addinfo.ts b/src/ts/process/embedding/addinfo.ts new file mode 100644 index 00000000..1383dc77 --- /dev/null +++ b/src/ts/process/embedding/addinfo.ts @@ -0,0 +1,37 @@ +import { DataBase, type Chat, type character } from "src/ts/storage/database"; +import { HypaProcesser } from '../memory/hypamemory' +import type { OpenAIChat } from ".."; +import { stringlizeChat } from "../stringlize"; +import { get } from "svelte/store"; + +export async function additionalInformations(char: character,chats:Chat,){ + const processer = new HypaProcesser('MiniLM') + const db = get(DataBase) + + const info = char.additionalText + if(info){ + const infos = info.split('\n\n') + + await processer.addText(infos) + const filteredChat = chats.message.slice(0, 4).map((chat) => { + let name = chat.saying ?? '' + + if(!name){ + if(chat.role === 'user'){ + name = db.username + } + else{ + name = char.name + } + } + + return `${name}: ${chat.data}` + }).join("\n\n") + const searched = await processer.similaritySearch(filteredChat) + const result = searched.slice(0,3).join("\n\n") + return result + } + + return '' + +} \ No newline at end of file diff --git a/src/ts/process/index.ts b/src/ts/process/index.ts index 273e213e..75c9f3f8 100644 --- a/src/ts/process/index.ts +++ b/src/ts/process/index.ts @@ -17,6 +17,7 @@ import { clone, cloneDeep } from "lodash"; import { groupOrder } from "./group"; import { runTrigger, type additonalSysPrompt } from "./triggers"; import { HypaProcesser } from "./memory/hypamemory"; +import { additionalInformations } from "./embedding/addinfo"; export interface OpenAIChat{ role: 'system'|'user'|'assistant'|'function' @@ -226,6 +227,9 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n { let description = risuChatParser((db.promptPreprocess ? db.descriptionPrefix: '') + currentChar.desc, {chara: currentChar}) + const additionalInfo = await additionalInformations(currentChar, currentChat) + + if(currentChar.personality){ description += risuChatParser("\n\nDescription of {{char}}: " + currentChar.personality, {chara: currentChar}) } diff --git a/src/ts/storage/database.ts b/src/ts/storage/database.ts index d08d1f04..ed167ee1 100644 --- a/src/ts/storage/database.ts +++ b/src/ts/storage/database.ts @@ -572,6 +572,7 @@ export interface character{ backgroundCSS?:string license?:string private?:boolean + additionalText:string }