diff --git a/src/lang/en.ts b/src/lang/en.ts index dd02a418..f91d8099 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -365,6 +365,16 @@ export const languageEnglish = { v2UpdateGUIDesc: "Update GUI", v2Wait: "Wait", v2WaitDesc: "Wait {{value}} seconds", + v2GetRequestState: "Get Request Data Content", + v2GetRequestStateDesc: "Get Request Content at {{index}} => {{outputVar}}", + v2SetRequestState: "Set Request Data Content", + v2SetRequestStateDesc: "Set Request Content at {{index}} to {{value}}", + v2GetRequestStateRole: "Get Request Data Role", + v2GetRequestStateRoleDesc: "Get Request Data Role at {{index}} => {{outputVar}}", + v2SetRequestStateRole: "Set Request Data Role", + v2SetRequestStateRoleDesc: "Set Request Data Role at {{index}} to {{value}}", + v2GetRequestStateLength: "Get Request Data Length", + v2GetRequestStateLengthDesc: "Get Request Data Length => {{outputVar}}", }, confirm: "Confirm", diff --git a/src/lang/ko.ts b/src/lang/ko.ts index 9ba40a73..f7642e9c 100644 --- a/src/lang/ko.ts +++ b/src/lang/ko.ts @@ -317,6 +317,16 @@ export const languageKorean = { "v2UpdateGUIDesc": "GUI 업데이트", "v2Wait": "기다리기", "v2WaitDesc": "{{value}} 초 기다리기", + "v2GetRequestState": "리퀘스트 데이터 내용 가져오기", + "v2GetRequestStateDesc": "{{index}}에서 리퀘스트 내용 가져오기 => {{outputVar}}", + "v2SetRequestState": "리퀘스트 데이터 내용 설정", + "v2SetRequestStateDesc": "{{index}}에 있는 리퀘스트 내용을 {{value}}로 설정", + "v2GetRequestStateRole": "리퀘스트 데이터 역할 가져오기", + "v2GetRequestStateRoleDesc": "{{index}}에서 리퀘스트 데이터 역할 가져오기 => {{outputVar}}", + "v2SetRequestStateRole": "리퀘스트 데이터 역할 설정", + "v2SetRequestStateRoleDesc": "{{index}}에 있는 리퀘스트 데이터 역할을 {{value}}로 설정", + "v2GetRequestStateLength": "리퀘스트 데이터 길이 가져오기", + "v2GetRequestStateLengthDesc": "리퀘스트 데이터 길이 가져오기 => {{outputVar}}", }, "confirm": "확인", "goback": "뒤로", diff --git a/src/lib/SideBars/Scripts/TriggerList2.svelte b/src/lib/SideBars/Scripts/TriggerList2.svelte index 7ab2c22c..86a86ebf 100644 --- a/src/lib/SideBars/Scripts/TriggerList2.svelte +++ b/src/lib/SideBars/Scripts/TriggerList2.svelte @@ -7,7 +7,7 @@ import Portal from "src/lib/UI/GUI/Portal.svelte"; import SelectInput from "src/lib/UI/GUI/SelectInput.svelte"; import TextInput from "src/lib/UI/GUI/TextInput.svelte"; - import { type triggerEffectV2, type triggerEffect, type triggerscript, displayAllowList } from "src/ts/process/triggers"; + import { type triggerEffectV2, type triggerEffect, type triggerscript, displayAllowList, requestAllowList } from "src/ts/process/triggers"; import { sleep } from "src/ts/util"; import { onDestroy, onMount } from "svelte"; @@ -20,6 +20,11 @@ //Special 'v2GetDisplayState', 'v2SetDisplayState', + 'v2GetRequestState', + 'v2SetRequestState', + 'v2GetRequestStateRole', + 'v2SetRequestStateRole', + 'v2GetRequestStateLength', //Control 'v2SetVar', @@ -102,6 +107,16 @@ 'v2RunImgGen' ] + + const specialTypes = [ + 'v2GetDisplayState', + 'v2SetDisplayState', + 'v2GetRequestState', + 'v2SetRequestState', + 'v2GetRequestStateRole', + 'v2SetRequestStateRole', + 'v2GetRequestStateLength', + ] let lastClickTime = 0 let { value = $bindable([]), lowLevelAble = false }: Props = $props(); @@ -123,12 +138,15 @@ } const checkSupported = (e:string) => { - if(e === 'v2SetDisplayState' || e === 'v2GetDisplayState'){ - return value[selectedIndex].type === 'display' - } if(value[selectedIndex].type === 'display'){ return displayAllowList.includes(e) } + if(value[selectedIndex].type === 'request'){ + return requestAllowList.includes(e) + } + if(specialTypes.includes(e)){ + return false + } if(lowLevelAble){ return true @@ -665,6 +683,56 @@ } break; } + case 'v2GetRequestState':{ + editTrigger = { + type: 'v2GetRequestState', + outputVar: '', + index: '', + indexType: 'value', + indent: 0 + } + break; + } + case 'v2SetRequestState':{ + editTrigger = { + type: 'v2SetRequestState', + value: '', + valueType: 'value', + index: '', + indexType: 'value', + indent: 0 + } + break; + } + case 'v2GetRequestStateRole':{ + editTrigger = { + type: 'v2GetRequestStateRole', + outputVar: '', + index: '', + indexType: 'value', + indent: 0 + } + break; + } + case 'v2SetRequestStateRole':{ + editTrigger = { + type: 'v2SetRequestStateRole', + value: '', + valueType: 'value', + index: '', + indexType: 'value', + indent: 0 + } + break; + } + case 'v2GetRequestStateLength':{ + editTrigger = { + type: 'v2GetRequestStateLength', + outputVar: '', + indent: 0 + } + break; + } } } @@ -863,6 +931,7 @@ {language.triggerInput} {language.triggerManual} {language.editDisplay} + {language.editProcess} @@ -1513,6 +1582,57 @@ {language.var} + {:else if editTrigger.type === 'v2GetRequestState'} + {language.index} + + {language.value} + {language.var} + + + + {language.outputVar} + + {:else if editTrigger.type === 'v2GetRequestStateRole'} + {language.index} + + {language.value} + {language.var} + + + + {language.outputVar} + + {:else if editTrigger.type === 'v2SetRequestState'} + {language.index} + + {language.value} + {language.var} + + + + {language.value} + + {language.value} + {language.var} + + + {:else if editTrigger.type === 'v2SetRequestStateRole'} + {language.index} + + {language.value} + {language.var} + + + + {language.value} + + {language.value} + {language.var} + + + {:else if editTrigger.type === 'v2GetRequestStateLength'} + {language.outputVar} + {:else} {language.noConfig} {/if} diff --git a/src/ts/process/request.ts b/src/ts/process/request.ts index 1a0c632c..33d02a3e 100644 --- a/src/ts/process/request.ts +++ b/src/ts/process/request.ts @@ -1,5 +1,5 @@ import type { MultiModal, OpenAIChat, OpenAIChatFull } from "./index.svelte"; -import { getCurrentCharacter, getDatabase, setDatabase, type character } from "../storage/database.svelte"; +import { getCurrentCharacter, getCurrentChat, getDatabase, setDatabase, type character } from "../storage/database.svelte"; import { pluginProcess, pluginV2 } from "../plugins/plugins"; import { language } from "../../lang"; import { stringlizeAINChat, getStopStrings, unstringlizeAIN, unstringlizeChat } from "./stringlize"; @@ -21,6 +21,7 @@ import { applyChatTemplate } from "./templates/chatTemplate"; import { OobaParams } from "./prompt"; import { extractJSON, getGeneralJSONSchema, getOpenAIJSONSchema } from "./templates/jsonSchema"; import { getModelInfo, LLMFlags, LLMFormat, type LLMModel } from "../model/modellist"; +import { runTrigger } from "./triggers"; @@ -243,6 +244,29 @@ export async function requestChatData(arg:requestDataArgument, model:ModelModeEx arg.formated = await replacer(arg.formated, model) } } + + try{ + const currentChar = getCurrentCharacter() + if(currentChar.type !== 'group'){ + const perf = performance.now() + const d = await runTrigger(currentChar, 'request', { + chat: getCurrentChat(), + displayMode: true, + displayData: JSON.stringify(arg.formated) + }) + + const got = JSON.parse(d.displayData) + if(!got || !Array.isArray(got)){ + throw new Error('Invalid return') + } + arg.formated = got + console.log('Trigger time', performance.now() - perf) + } + } + catch(e){ + console.error(e) + } + const da = await requestChatDataMain(arg, model, abortSignal) diff --git a/src/ts/process/triggers.ts b/src/ts/process/triggers.ts index f6b86301..fff25062 100644 --- a/src/ts/process/triggers.ts +++ b/src/ts/process/triggers.ts @@ -9,7 +9,7 @@ import { parseKeyValue, sleep } from "../util"; import { alertError, alertInput, alertNormal, alertSelect } from "../alert"; import type { OpenAIChat } from "./index.svelte"; import { HypaProcesser } from "./memory/hypamemory"; -import { requestChatData } from "./request"; +import { requestChatData, type OpenAIChatExtra } from "./request"; import { generateAIImage } from "./stableDiff"; import { writeInlayImage } from "./files/inlays"; import { runLua } from "./lua"; @@ -17,7 +17,7 @@ import { runLua } from "./lua"; export interface triggerscript{ comment: string; - type: 'start'|'manual'|'output'|'input'|'display' + type: 'start'|'manual'|'output'|'input'|'display'|'request' conditions: triggerCondition[] effect:triggerEffect[] lowLevelAccess?: boolean @@ -37,7 +37,8 @@ export type triggerEffectV2 = triggerV2Header|triggerV2IfVar|triggerV2Else|tri triggerV2SetCharacterDesc|triggerV2MakeArrayVar|triggerV2GetArrayVarLength|triggerV2GetArrayVar|triggerV2SetArrayVar| triggerV2PushArrayVar|triggerV2PopArrayVar|triggerV2ShiftArrayVar|triggerV2UnshiftArrayVar|triggerV2SpliceArrayVar|triggerV2GetFirstMessage| triggerV2SliceArrayVar|triggerV2GetIndexOfValueInArrayVar|triggerV2RemoveIndexFromArrayVar|triggerV2ConcatString|triggerV2GetLastUserMessage| - triggerV2GetLastCharMessage|triggerV2GetAlertInput|triggerV2GetDisplayState|triggerV2SetDisplayState|triggerV2UpdateGUI|triggerV2Wait + triggerV2GetLastCharMessage|triggerV2GetAlertInput|triggerV2GetDisplayState|triggerV2SetDisplayState|triggerV2UpdateGUI|triggerV2Wait| + triggerV2GetRequestState|triggerV2SetRequestState|triggerV2GetRequestStateRole|triggerV2SetRequestStateRole|triggerV2GetReuqestStateLength export type triggerConditionsVar = { type:'var'|'value' @@ -95,7 +96,7 @@ export interface triggerEffectImpersonate{ value:string } -type triggerMode = 'start'|'manual'|'output'|'input'|'display' +type triggerMode = 'start'|'manual'|'output'|'input'|'display'|'request' export interface triggerEffectCommand{ type: 'command', @@ -625,6 +626,46 @@ export type triggerV2SetDisplayState = { indent: number } +export type triggerV2GetRequestState = { + type: 'v2GetRequestState', + outputVar: string, + index: string, + indexType: 'var'|'value', + indent: number +} + +export type triggerV2GetRequestStateRole = { + type: 'v2GetRequestStateRole', + outputVar: string, + index: string, + indexType: 'var'|'value', + indent: number +} + +export type triggerV2SetRequestState = { + type: 'v2SetRequestState', + value: string, + valueType: 'var'|'value', + index: string, + indexType: 'var'|'value', + indent: number +} + +export type triggerV2SetRequestStateRole = { + type: 'v2SetRequestStateRole', + value: string, + valueType: 'var'|'value', + index: string, + indexType: 'var'|'value', + indent: number +} + +export type triggerV2GetReuqestStateLength = { + type: 'v2GetRequestStateLength', + outputVar: string, + indent: number +} + export type triggerV2UpdateGUI = { type: 'v2UpdateGUI', indent: number @@ -637,9 +678,7 @@ export type triggerV2Wait = { indent: number } -export const displayAllowList = [ - 'v2GetDisplayState', - 'v2SetDisplayState', +const safeSubset = [ 'v2SetVar', 'v2If', 'v2Else', @@ -671,6 +710,21 @@ export const displayAllowList = [ 'v2RemoveIndexFromArrayVar' ] +export const displayAllowList = [ + 'v2GetDisplayState', + 'v2SetDisplayState', + ...safeSubset +] + +export const requestAllowList = [ + 'v2GetRequestState', + 'v2SetRequestState', + 'v2GetRequestStateRole', + 'v2SetRequestStateRole', + 'v2GetRequestStateLength', + ...safeSubset +] + export async function runTrigger(char:character,mode:triggerMode, arg:{ chat: Chat, recursiveCount?: number @@ -838,7 +892,10 @@ export async function runTrigger(char:character,mode:triggerMode, arg:{ for(let index = 0; index < trigger.effect.length; index++){ const effect = trigger.effect[index] - if(arg.displayMode && !displayAllowList.includes(effect.type)){ + if(mode === 'display' && !displayAllowList.includes(effect.type)){ + continue + } + if(mode === 'request' && !requestAllowList.includes(effect.type)){ continue } switch(effect.type){ @@ -1704,6 +1761,59 @@ export async function runTrigger(char:character,mode:triggerMode, arg:{ await sleep(value * 1000) break } + case 'v2GetRequestState':{ + if(!arg.displayMode){ + return + } + const json = JSON.parse(arg.displayData) as OpenAIChat[] + const index = effect.indexType === 'value' ? Number(risuChatParser(effect.index,{chara:char})) : Number(getVar(risuChatParser(effect.index,{chara:char}))) + const content = json?.[index]?.content ?? 'null' + setVar(effect.outputVar, content) + break + } + case 'v2SetRequestState':{ + if(!arg.displayMode){ + return + } + const json = JSON.parse(arg.displayData) as OpenAIChat[] + const index = effect.indexType === 'value' ? Number(risuChatParser(effect.index,{chara:char})) : Number(getVar(risuChatParser(effect.index,{chara:char}))) + const value = effect.valueType === 'value' ? risuChatParser(effect.value,{chara:char}) : getVar(risuChatParser(effect.value,{chara:char})) + json[index].content = value + arg.displayData = JSON.stringify(json) + break + } + case 'v2GetRequestStateRole':{ + if(!arg.displayMode){ + return + } + const json = JSON.parse(arg.displayData) as OpenAIChat[] + const index = effect.indexType === 'value' ? Number(risuChatParser(effect.index,{chara:char})) : Number(getVar(risuChatParser(effect.index,{chara:char}))) + const content = json?.[index]?.role ?? 'null' + setVar(effect.outputVar, content) + break + } + case 'v2SetRequestStateRole':{ + if(!arg.displayMode){ + return + } + const json = JSON.parse(arg.displayData) as OpenAIChat[] + const index = effect.indexType === 'value' ? Number(risuChatParser(effect.index,{chara:char})) : Number(getVar(risuChatParser(effect.index,{chara:char}))) + const value = effect.valueType === 'value' ? risuChatParser(effect.value,{chara:char}) : getVar(risuChatParser(effect.value,{chara:char})) + if(value === 'user' || value === 'assistant' || value === 'system'){ + json[index].role = value + } + arg.displayData = JSON.stringify(json) + break + } + + case 'v2GetRequestStateLength':{ + if(!arg.displayMode){ + return + } + const json = JSON.parse(arg.displayData) as OpenAIChat[] + setVar(effect.outputVar, json.length.toString()) + break + } } } }