diff --git a/src/lang/en.ts b/src/lang/en.ts index af62cebc..62ccab7e 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -162,6 +162,8 @@ export const languageEnglish = { strictJsonSchema: "If enabled, it will strictly follow the Provided Schema for JSON on some models. if it is disabled, it may ignore the JSON Schema.", extractJson: "If it is not blank, it will extract specific JSON data from the response. for example, if you want to extract `response.text[0]` in response `{\"response\": {\"text\": [\"hello\"]}}`, you can put `response.text.0`.", translatorNote: "Here, you can add a unique translation prompt for each character. This option only applies when using the Ax. model for translation. To apply it, include `{{slot::tnote}}` in the language settings. It doesn't work in group chats.", + groupInnerFormat: "This defines a format that is used in group chat for characters that isn't speaker. if it is not blank, it will use this format instead of the default format. if `Group Other Bot Role` is `assistant`, it will also be applied to the speaker.", + groupOtherBotRole: "This defines a role that is used in group chat for characters that isn't speaker.", }, setup: { chooseProvider: "Choose AI Provider", @@ -743,4 +745,7 @@ export const languageEnglish = { trailingSingleQuote: "Trailing Single Quote", trailingDoubleQuote: "Trailing Double Quote", translatorNote: "Translator's Note", + formatGroupInSingle: "Format Group in Single", + groupInnerFormat: "Non-Speaker Inner Format", + groupOtherBotRole: "Non-Speaker Role in Group", } \ No newline at end of file diff --git a/src/lib/Setting/Pages/PromptSettings.svelte b/src/lib/Setting/Pages/PromptSettings.svelte index 8e594476..1a025efa 100644 --- a/src/lib/Setting/Pages/PromptSettings.svelte +++ b/src/lib/Setting/Pages/PromptSettings.svelte @@ -10,6 +10,8 @@ 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"; + import SelectInput from "src/lib/UI/GUI/SelectInput.svelte"; + import OptionInput from "src/lib/UI/GUI/OptionInput.svelte"; let sorted = 0 let opened = 0 @@ -112,7 +114,7 @@ - + @@ -124,10 +126,18 @@ {/if} {language.maxThoughtTagDepth} + {language.groupOtherBotRole} + + User + System + assistant + {language.customPromptTemplateToggle} {language.defaultVariables} + {language.groupInnerFormat} + \n{{slot}}\n`} bind:value={$DataBase.groupTemplate}/> {#if $DataBase.jsonSchemaEnabled} {language.jsonSchema} diff --git a/src/ts/parser.ts b/src/ts/parser.ts index 979fbae5..d2af1c79 100644 --- a/src/ts/parser.ts +++ b/src/ts/parser.ts @@ -1782,9 +1782,14 @@ export function risuChatParser(da:string, arg:{ if(aChara){ if(typeof(aChara) !== 'string' && aChara.type === 'group'){ - const gc = findCharacterbyId(aChara.chats[aChara.chatPage].message.at(-1).saying ?? '') - if(gc.name !== 'Unknown Character'){ - chara = gc + if(aChara.chats[aChara.chatPage].message.length > 0){ + const gc = findCharacterbyId(aChara.chats[aChara.chatPage].message.at(-1).saying ?? '') + if(gc.name !== 'Unknown Character'){ + chara = gc + } + } + else{ + chara = 'bot' } } else{ diff --git a/src/ts/process/index.ts b/src/ts/process/index.ts index 4d5f6fdb..18ad7ac1 100644 --- a/src/ts/process/index.ts +++ b/src/ts/process/index.ts @@ -699,10 +699,25 @@ export async function sendChat(chatProcessIndex = -1,arg:{ } let attr:string[] = [] + let role:'user'|'assistant'|'system' = msg.role === 'user' ? 'user' : 'assistant' - if(nowChatroom.type === 'group' || (usingPromptTemplate && db.promptSettings.sendName)){ - formatedChat = name + ': ' + formatedChat - attr.push('nameAdded') + if( + (nowChatroom.type === 'group' && findCharacterbyIdwithCache(msg.saying).chaId !== currentChar.chaId) || + (nowChatroom.type === 'group' && db.groupOtherBotRole === 'assistant') || + (usingPromptTemplate && db.promptSettings.sendName) + ){ + const form = db.groupTemplate || `<{{char}}\'s Message>\n{{slot}}\n` + formatedChat = risuChatParser(form, {chara: findCharacterbyIdwithCache(msg.saying).name}).replace('{{slot}}', formatedChat) + switch(db.groupOtherBotRole){ + case 'user': + case 'assistant': + case 'system': + role = db.groupOtherBotRole + break + default: + role = 'assistant' + break + } } if(usingPromptTemplate && db.promptSettings.maxThoughtTagDepth !== -1){ const depth = ms.length - index @@ -712,7 +727,7 @@ export async function sendChat(chatProcessIndex = -1,arg:{ } const chat:OpenAIChat = { - role: msg.role === 'user' ? 'user' : 'assistant', + role: role, content: formatedChat, memo: msg.chatId, attr: attr, @@ -725,6 +740,7 @@ export async function sendChat(chatProcessIndex = -1,arg:{ currentTokens += await tokenizer.tokenizeChat(chat) index++ } + console.log(JSON.stringify(chats, null, 2)) const depthPrompts = lorepmt.actives.filter(v => { return (v.pos === 'depth' && v.depth > 0) || v.pos === 'reverse_depth' diff --git a/src/ts/storage/database.ts b/src/ts/storage/database.ts index 24f1c364..e2361b36 100644 --- a/src/ts/storage/database.ts +++ b/src/ts/storage/database.ts @@ -442,6 +442,7 @@ export function setDatabase(data:Database){ } data.customQuotes ??= false data.customQuotesData ??= ['“','”','‘','’'] + data.groupOtherBotRole ??= 'user' changeLanguage(data.language) DataBase.set(data) } @@ -747,6 +748,8 @@ export interface Database{ } customQuotes:boolean customQuotesData?:[string, string, string, string] + groupTemplate?:string + groupOtherBotRole?:string } export interface customscript{ @@ -1008,6 +1011,8 @@ export interface botPreset{ jsonSchema?:string strictJsonSchema?:boolean extractJson?:string + groupTemplate?:string + groupOtherBotRole?:string } @@ -1298,6 +1303,8 @@ export function saveCurrentPreset(){ jsonSchema:db.jsonSchema ?? '', strictJsonSchema:db.strictJsonSchema ?? true, extractJson:db.extractJson ?? '', + groupOtherBotRole: db.groupOtherBotRole ?? 'user', + groupTemplate: db.groupTemplate ?? '', } db.botPresets = pres setDatabase(db) @@ -1390,6 +1397,8 @@ export function setPreset(db:Database, newPres: botPreset){ db.jsonSchema = newPres.jsonSchema ?? '' db.strictJsonSchema = newPres.strictJsonSchema ?? true db.extractJson = newPres.extractJson ?? '' + db.groupOtherBotRole = newPres.groupOtherBotRole ?? 'user' + db.groupTemplate = newPres.groupTemplate ?? '' return db }