Add low level access
This commit is contained in:
@@ -129,6 +129,8 @@ export const languageEnglish = {
|
|||||||
customChainOfThought: "Warning: chain of thought toggle is no longer recommended to use. put chain of thought prompt in other prompt entries instead.",
|
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 `<toggle variable>=<toggle name>` format, seperated by newline. for example, `cot=Toggle COT`. you can use these toggles in prompt by using `{{getglobalvar::toggle_<toggle variable>}}`. like `{{getglobalvar::toggle_cot}}`.",
|
customPromptTemplateToggle: "Here you can define your own prompt toggles. use `<toggle variable>=<toggle name>` format, seperated by newline. for example, `cot=Toggle COT`. you can use these toggles in prompt by using `{{getglobalvar::toggle_<toggle variable>}}`. like `{{getglobalvar::toggle_cot}}`.",
|
||||||
defaultVariables: "Here you can define your own default variables. use `<variable name>=<variable value>` format, seperated by newline. for example, `name=RisuAI`, which then can be used with trigger scripts and variables CBS like `{{getvar::A}}`, `{{setvar::A::B}}` or `{{? $A + 1}}`. if prompt template's default variable and character's default variable has same name, character's default variable will be used.",
|
defaultVariables: "Here you can define your own default variables. use `<variable name>=<variable value>` format, seperated by newline. for example, `name=RisuAI`, which then can be used with trigger scripts and variables CBS like `{{getvar::A}}`, `{{setvar::A::B}}` or `{{? $A + 1}}`. if prompt template's default variable and character's default variable has same name, character's default variable will be used.",
|
||||||
|
lowLevelAccess: "If enabled, it will enable access to features that requires high computing powers and executing AI model via triggers in the character. do not enable this unless you really need these features.",
|
||||||
|
triggerLLMPrompt: "A prompt that would be sent to the model. you can use multi turns and roles by using `@@role user`, `@@role system`, `@@role assistant`. for example, \n\`\`\`\n@@role system\nrespond as hello\n@@role assistant\nhello\n@@role user\nhi\n\`\`\`",
|
||||||
},
|
},
|
||||||
setup: {
|
setup: {
|
||||||
chooseProvider: "Choose AI Provider",
|
chooseProvider: "Choose AI Provider",
|
||||||
@@ -618,4 +620,16 @@ export const languageEnglish = {
|
|||||||
hypaV2Desc: "HypaMemory V2 is a long-term memory system that use both summarized data and vector search.",
|
hypaV2Desc: "HypaMemory V2 is a long-term memory system that use both summarized data and vector search.",
|
||||||
supaDesc: "SupaMemory is a long-term memory system that uses summarized data to AI.",
|
supaDesc: "SupaMemory is a long-term memory system that uses summarized data to AI.",
|
||||||
hanuraiDesc: "HanuraiMemory is a memory system that uses vector search.",
|
hanuraiDesc: "HanuraiMemory is a memory system that uses vector search.",
|
||||||
|
lowLevelAccess: "Low Level Access",
|
||||||
|
resultStoredVar: "Variable to Store Result",
|
||||||
|
triggerEffRunLLM: "Run Main Model",
|
||||||
|
triggerEffectSendAI: "Resend AI",
|
||||||
|
triggerEffCheckSim: "Check Similarity",
|
||||||
|
triggerEffShowAlert: "Show Alert",
|
||||||
|
normal: "Normal",
|
||||||
|
error: "Error",
|
||||||
|
input: "Input",
|
||||||
|
select: "Select",
|
||||||
|
lowLevelAccessConfirm: "This character uses Low Level Access. which means this character can access the AI model and your storage directly. do you really want to import this character?",
|
||||||
|
triggerLowLevelOnly: "This trigger only works with Low Level Access. to enable this trigger, enable Low Level Access in advanced settings in the character.",
|
||||||
}
|
}
|
||||||
@@ -893,6 +893,11 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="flex items-center mt-4">
|
||||||
|
<Check bind:check={currentChar.data.lowLevelAccess} name={language.lowLevelAccess}/>
|
||||||
|
<span> <Help key="lowLevelAccess" name={language.lowLevelAccess}/></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="flex items-center mt-4">
|
<div class="flex items-center mt-4">
|
||||||
<Check bind:check={currentChar.data.utilityBot} name={language.utilityBot}/>
|
<Check bind:check={currentChar.data.utilityBot} name={language.utilityBot}/>
|
||||||
<span> <Help key="utilityBot" name={language.utilityBot}/></span>
|
<span> <Help key="utilityBot" name={language.utilityBot}/></span>
|
||||||
@@ -954,6 +959,11 @@
|
|||||||
<Help key="experimental" name={language.useCharLorebook}/>
|
<Help key="experimental" name={language.useCharLorebook}/>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
<div class="flex items-center mt-4">
|
||||||
|
<Check bind:check={currentChar.data.lowLevelAccess} name={language.lowLevelAccess}/>
|
||||||
|
<span> <Help key="lowLevelAccess" name={language.lowLevelAccess}/></span>
|
||||||
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
<Button on:click={async () => {
|
<Button on:click={async () => {
|
||||||
removeChar($selectedCharID, currentChar.data.name)
|
removeChar($selectedCharID, currentChar.data.name)
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
import OptionInput from "../../UI/GUI/OptionInput.svelte";
|
import OptionInput from "../../UI/GUI/OptionInput.svelte";
|
||||||
import NumberInput from "src/lib/UI/GUI/NumberInput.svelte";
|
import NumberInput from "src/lib/UI/GUI/NumberInput.svelte";
|
||||||
import TextAreaInput from "src/lib/UI/GUI/TextAreaInput.svelte";
|
import TextAreaInput from "src/lib/UI/GUI/TextAreaInput.svelte";
|
||||||
|
import Help from "src/lib/Others/Help.svelte";
|
||||||
|
import { CurrentCharacter } from "src/ts/stores";
|
||||||
|
|
||||||
export let value:triggerscript
|
export let value:triggerscript
|
||||||
export let onRemove: () => void = () => {}
|
export let onRemove: () => void = () => {}
|
||||||
@@ -231,6 +233,29 @@
|
|||||||
value: ''
|
value: ''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(effect.type === 'runLLM'){
|
||||||
|
effect = {
|
||||||
|
type: 'runLLM',
|
||||||
|
value: '',
|
||||||
|
inputVar: ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(effect.type === 'checkSimilarity'){
|
||||||
|
effect = {
|
||||||
|
type: 'checkSimilarity',
|
||||||
|
source: '',
|
||||||
|
value: '',
|
||||||
|
inputVar: ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(effect.type === 'showAlert'){
|
||||||
|
effect = {
|
||||||
|
type: 'showAlert',
|
||||||
|
alertType: 'normal',
|
||||||
|
value: '',
|
||||||
|
inputVar: ''
|
||||||
|
}
|
||||||
|
}
|
||||||
}}>
|
}}>
|
||||||
<OptionInput value="setvar">{language.triggerEffSetVar}</OptionInput>
|
<OptionInput value="setvar">{language.triggerEffSetVar}</OptionInput>
|
||||||
<OptionInput value="impersonate">{language.triggerEffImperson}</OptionInput>
|
<OptionInput value="impersonate">{language.triggerEffImperson}</OptionInput>
|
||||||
@@ -242,11 +267,26 @@
|
|||||||
<OptionInput value="stop">{language.triggerEffStop}</OptionInput>
|
<OptionInput value="stop">{language.triggerEffStop}</OptionInput>
|
||||||
{/if}
|
{/if}
|
||||||
<OptionInput value="runtrigger">{language.triggerEffRunTrigger}</OptionInput>
|
<OptionInput value="runtrigger">{language.triggerEffRunTrigger}</OptionInput>
|
||||||
|
<OptionInput value="runLLM">{language.triggerEffRunLLM}</OptionInput>
|
||||||
|
<OptionInput value="checkSimilarity">{language.triggerEffCheckSim}</OptionInput>
|
||||||
|
<OptionInput value="showAlert">{language.triggerEffShowAlert}</OptionInput>
|
||||||
|
{#if effect.type === 'sendAIprompt' || value.type === 'output'}
|
||||||
|
<OptionInput value="sendAIprompt">{language.triggerEffectSendAI}</OptionInput>
|
||||||
|
{/if}
|
||||||
</SelectInput>
|
</SelectInput>
|
||||||
{#if value.type !== 'start' && (effect.type === 'systemprompt' || effect.type === 'stop')}
|
{#if
|
||||||
|
(value.type !== 'start' && (effect.type === 'systemprompt' || effect.type === 'stop')) ||
|
||||||
|
(value.type === 'output' && effect.type === 'sendAIprompt')
|
||||||
|
}
|
||||||
<span class="text-red-400 text-sm">{language.invaildTriggerEffect}</span>
|
<span class="text-red-400 text-sm">{language.invaildTriggerEffect}</span>
|
||||||
{/if}
|
{/if}
|
||||||
|
{#if
|
||||||
|
!$CurrentCharacter.lowLevelAccess && (effect.type === 'runLLM' || effect.type === 'checkSimilarity' || effect.type === 'showAlert' || effect.type === 'sendAIprompt')
|
||||||
|
}
|
||||||
|
<span class="text-red-400 text-sm">{language.triggerLowLevelOnly}</span>
|
||||||
|
|
||||||
|
{/if}
|
||||||
|
|
||||||
{#if effect.type === 'systemprompt'}
|
{#if effect.type === 'systemprompt'}
|
||||||
<span class="text-textcolor2 text-sm">{language.location}</span>
|
<span class="text-textcolor2 text-sm">{language.location}</span>
|
||||||
<SelectInput bind:value={effect.location}>
|
<SelectInput bind:value={effect.location}>
|
||||||
@@ -280,6 +320,38 @@
|
|||||||
<span class="text-textcolor2 text-sm">{language.value}</span>
|
<span class="text-textcolor2 text-sm">{language.value}</span>
|
||||||
<TextAreaInput highlight bind:value={effect.value} />
|
<TextAreaInput highlight bind:value={effect.value} />
|
||||||
{/if}
|
{/if}
|
||||||
|
{#if effect.type === 'runLLM'}
|
||||||
|
<span class="text-textcolor2 text-sm">{language.prompt} <Help key="triggerLLMPrompt" /></span>
|
||||||
|
<TextAreaInput highlight bind:value={effect.value} />
|
||||||
|
|
||||||
|
<span class="text-textcolor2 text-sm">{language.resultStoredVar}</span>
|
||||||
|
<TextInput bind:value={effect.inputVar} />
|
||||||
|
{/if}
|
||||||
|
{#if effect.type === 'checkSimilarity'}
|
||||||
|
<span class="text-textcolor2 text-sm">{language.prompt}</span>
|
||||||
|
<TextAreaInput highlight bind:value={effect.source} />
|
||||||
|
|
||||||
|
<span class="text-textcolor2 text-sm">{language.value}</span>
|
||||||
|
<TextAreaInput highlight bind:value={effect.value} />
|
||||||
|
|
||||||
|
<span class="text-textcolor2 text-sm">{language.resultStoredVar}</span>
|
||||||
|
<TextInput bind:value={effect.inputVar} />
|
||||||
|
{/if}
|
||||||
|
{#if effect.type === 'showAlert'}
|
||||||
|
<span class="text-textcolor2 text-sm">{language.type}</span>
|
||||||
|
<SelectInput bind:value={effect.alertType}>
|
||||||
|
<OptionInput value="normal">{language.normal}</OptionInput>
|
||||||
|
<OptionInput value="error">{language.error}</OptionInput>
|
||||||
|
<OptionInput value="input">{language.input}</OptionInput>
|
||||||
|
<OptionInput value="select">{language.select}</OptionInput>
|
||||||
|
</SelectInput>
|
||||||
|
|
||||||
|
<span class="text-textcolor2 text-sm">{language.value}</span>
|
||||||
|
<TextAreaInput highlight bind:value={effect.value} />
|
||||||
|
|
||||||
|
<span class="text-textcolor2 text-sm">{language.resultStoredVar}</span>
|
||||||
|
<TextInput bind:value={effect.inputVar} />
|
||||||
|
{/if}
|
||||||
{#if effect.type === 'impersonate'}
|
{#if effect.type === 'impersonate'}
|
||||||
<span class="text-textcolor2 text-sm">{language.role}</span>
|
<span class="text-textcolor2 text-sm">{language.role}</span>
|
||||||
<SelectInput bind:value={effect.role} size="sm">
|
<SelectInput bind:value={effect.role} size="sm">
|
||||||
|
|||||||
@@ -479,6 +479,12 @@ async function importCharacterCardSpec(card:CharacterCardV2Risu|CharacterCardV3,
|
|||||||
sdData = risuext.sdData ?? sdData
|
sdData = risuext.sdData ?? sdData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(risuext.lowLevelAccess){
|
||||||
|
const conf = alertConfirm(language.lowLevelAccessConfirm)
|
||||||
|
if(!conf){
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
const charbook = data.character_book
|
const charbook = data.character_book
|
||||||
let lorebook:loreBook[] = []
|
let lorebook:loreBook[] = []
|
||||||
let loresettings:undefined|loreSettings = undefined
|
let loresettings:undefined|loreSettings = undefined
|
||||||
@@ -586,6 +592,7 @@ async function importCharacterCardSpec(card:CharacterCardV2Risu|CharacterCardV3,
|
|||||||
imported: true,
|
imported: true,
|
||||||
source: card?.data?.extensions?.risuai?.source ?? [],
|
source: card?.data?.extensions?.risuai?.source ?? [],
|
||||||
ccAssets: ccAssets,
|
ccAssets: ccAssets,
|
||||||
|
lowLevelAccess: risuext.lowLevelAccess ?? false
|
||||||
}
|
}
|
||||||
|
|
||||||
if(card.spec === 'chara_card_v3'){
|
if(card.spec === 'chara_card_v3'){
|
||||||
@@ -939,7 +946,8 @@ export function createBaseV3(char:character){
|
|||||||
lorePlus: char.lorePlus,
|
lorePlus: char.lorePlus,
|
||||||
inlayViewScreen: char.inlayViewScreen,
|
inlayViewScreen: char.inlayViewScreen,
|
||||||
newGenData: char.newGenData,
|
newGenData: char.newGenData,
|
||||||
vits: {}
|
vits: {},
|
||||||
|
lowLevelAccess: char.lowLevelAccess ?? false
|
||||||
},
|
},
|
||||||
depth_prompt: char.depth_prompt
|
depth_prompt: char.depth_prompt
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import { findCharacterbyId, parseKeyValue, sfc32, uuidtoNumber } from './util';
|
|||||||
import { getInlayImage } from './process/files/image';
|
import { getInlayImage } from './process/files/image';
|
||||||
import { autoMarkNew } from './plugins/automark';
|
import { autoMarkNew } from './plugins/automark';
|
||||||
import { getModuleLorebooks } from './process/modules';
|
import { getModuleLorebooks } from './process/modules';
|
||||||
|
import { HypaProcesser } from './process/memory/hypamemory';
|
||||||
|
|
||||||
const mconverted = new Marked({
|
const mconverted = new Marked({
|
||||||
gfm: true,
|
gfm: true,
|
||||||
|
|||||||
@@ -1087,6 +1087,7 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
|
|||||||
|
|
||||||
let result = ''
|
let result = ''
|
||||||
let emoChanged = false
|
let emoChanged = false
|
||||||
|
let resendChat = false
|
||||||
|
|
||||||
if(abortSignal.aborted === true){
|
if(abortSignal.aborted === true){
|
||||||
return false
|
return false
|
||||||
@@ -1151,6 +1152,9 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
|
|||||||
if(triggerResult && triggerResult.chat){
|
if(triggerResult && triggerResult.chat){
|
||||||
currentChat = triggerResult.chat
|
currentChat = triggerResult.chat
|
||||||
}
|
}
|
||||||
|
if(triggerResult && triggerResult.sendAIprompt){
|
||||||
|
resendChat = true
|
||||||
|
}
|
||||||
const inlayr = runInlayScreen(currentChar, currentChat.message[msgIndex].data)
|
const inlayr = runInlayScreen(currentChar, currentChat.message[msgIndex].data)
|
||||||
currentChat.message[msgIndex].data = inlayr.text
|
currentChat.message[msgIndex].data = inlayr.text
|
||||||
db.characters[selectedChar].chats[selectedChat] = currentChat
|
db.characters[selectedChar].chats[selectedChat] = currentChat
|
||||||
@@ -1236,6 +1240,9 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
|
|||||||
db.characters[selectedChar].chats[selectedChat] = triggerResult.chat
|
db.characters[selectedChar].chats[selectedChat] = triggerResult.chat
|
||||||
setDatabase(db)
|
setDatabase(db)
|
||||||
}
|
}
|
||||||
|
if(triggerResult && triggerResult.sendAIprompt){
|
||||||
|
resendChat = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let needsAutoContinue = false
|
let needsAutoContinue = false
|
||||||
@@ -1259,6 +1266,13 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(resendChat){
|
||||||
|
doingChat.set(false)
|
||||||
|
return await sendChat(chatProcessIndex, {
|
||||||
|
signal: abortSignal
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
chatProcessStage.set(4)
|
chatProcessStage.set(4)
|
||||||
|
|
||||||
sendPeerChar()
|
sendPeerChar()
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ import { get } from "svelte/store";
|
|||||||
import { CurrentCharacter, CurrentChat, selectedCharID } from "../stores";
|
import { CurrentCharacter, CurrentChat, selectedCharID } from "../stores";
|
||||||
import { processMultiCommand } from "./command";
|
import { processMultiCommand } from "./command";
|
||||||
import { parseKeyValue } from "../util";
|
import { parseKeyValue } from "../util";
|
||||||
|
import { alertError, alertInput, alertNormal, alertSelect } from "../alert";
|
||||||
|
import type { OpenAIChat } from ".";
|
||||||
|
import { HypaProcesser } from "./memory/hypamemory";
|
||||||
|
import { requestChatData } from "./request";
|
||||||
|
|
||||||
export interface triggerscript{
|
export interface triggerscript{
|
||||||
comment: string;
|
comment: string;
|
||||||
@@ -16,7 +20,7 @@ export interface triggerscript{
|
|||||||
|
|
||||||
export type triggerCondition = triggerConditionsVar|triggerConditionsExists|triggerConditionsChatIndex
|
export type triggerCondition = triggerConditionsVar|triggerConditionsExists|triggerConditionsChatIndex
|
||||||
|
|
||||||
export type triggerEffect = triggerEffectSetvar|triggerEffectSystemPrompt|triggerEffectImpersonate|triggerEffectCommand|triggerEffectStop|triggerEffectRunTrigger
|
export type triggerEffect = triggerEffectRunLLM|triggerEffectCheckSimilarity|triggerEffectSendAIprompt|triggerEffectShowAlert|triggerEffectSetvar|triggerEffectSystemPrompt|triggerEffectImpersonate|triggerEffectCommand|triggerEffectStop|triggerEffectRunTrigger
|
||||||
|
|
||||||
export type triggerConditionsVar = {
|
export type triggerConditionsVar = {
|
||||||
type:'var'|'value'
|
type:'var'|'value'
|
||||||
@@ -62,6 +66,13 @@ export interface triggerEffectCommand{
|
|||||||
value: string
|
value: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface triggerEffectShowAlert{
|
||||||
|
type: 'showAlert',
|
||||||
|
alertType: string
|
||||||
|
value: string
|
||||||
|
inputVar: string
|
||||||
|
}
|
||||||
|
|
||||||
export interface triggerEffectRunTrigger{
|
export interface triggerEffectRunTrigger{
|
||||||
type: 'runtrigger',
|
type: 'runtrigger',
|
||||||
value: string
|
value: string
|
||||||
@@ -71,6 +82,23 @@ export interface triggerEffectStop{
|
|||||||
type: 'stop'
|
type: 'stop'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface triggerEffectSendAIprompt{
|
||||||
|
type: 'sendAIprompt'
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface triggerEffectCheckSimilarity{
|
||||||
|
type: 'checkSimilarity',
|
||||||
|
source: string,
|
||||||
|
value: string,
|
||||||
|
inputVar: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface triggerEffectRunLLM{
|
||||||
|
type: 'runLLM',
|
||||||
|
value: string,
|
||||||
|
inputVar: string
|
||||||
|
}
|
||||||
|
|
||||||
export type additonalSysPrompt = {
|
export type additonalSysPrompt = {
|
||||||
start:string,
|
start:string,
|
||||||
historyend: string,
|
historyend: string,
|
||||||
@@ -88,6 +116,8 @@ export async function runTrigger(char:character,mode:triggerMode, arg:{
|
|||||||
char = structuredClone(char)
|
char = structuredClone(char)
|
||||||
let varChanged = false
|
let varChanged = false
|
||||||
let stopSending = arg.stopSending ?? false
|
let stopSending = arg.stopSending ?? false
|
||||||
|
let lowLevelAccess = char.lowLevelAccess ?? false
|
||||||
|
let sendAIprompt = false
|
||||||
const currentChat = get(CurrentChat)
|
const currentChat = get(CurrentChat)
|
||||||
let additonalSysPrompt:additonalSysPrompt = arg.additonalSysPrompt ?? {
|
let additonalSysPrompt:additonalSysPrompt = arg.additonalSysPrompt ?? {
|
||||||
start:'',
|
start:'',
|
||||||
@@ -269,7 +299,7 @@ export async function runTrigger(char:character,mode:triggerMode, arg:{
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
case 'runtrigger':{
|
case 'runtrigger':{
|
||||||
if(arg.recursiveCount < 10){
|
if(arg.recursiveCount < 10 || lowLevelAccess){
|
||||||
arg.recursiveCount++
|
arg.recursiveCount++
|
||||||
const r = await runTrigger(char,'manual',{
|
const r = await runTrigger(char,'manual',{
|
||||||
chat,
|
chat,
|
||||||
@@ -286,6 +316,116 @@ export async function runTrigger(char:character,mode:triggerMode, arg:{
|
|||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// low level access only
|
||||||
|
case 'showAlert':{
|
||||||
|
if(!lowLevelAccess){
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
const effectValue = risuChatParser(effect.value,{chara:char})
|
||||||
|
const inputVar = risuChatParser(effect.inputVar,{chara:char})
|
||||||
|
|
||||||
|
switch(effect.alertType){
|
||||||
|
case 'normal':{
|
||||||
|
alertNormal(effectValue)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
case 'error':{
|
||||||
|
alertError(effectValue)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
case 'input':{
|
||||||
|
const val = await alertInput(effectValue)
|
||||||
|
setVar(inputVar, val)
|
||||||
|
}
|
||||||
|
case 'select':{
|
||||||
|
const val = await alertSelect(effectValue.split('§'))
|
||||||
|
setVar(inputVar, val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'sendAIprompt':{
|
||||||
|
if(!lowLevelAccess){
|
||||||
|
break
|
||||||
|
}
|
||||||
|
sendAIprompt = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'runLLM':{
|
||||||
|
if(!lowLevelAccess){
|
||||||
|
break
|
||||||
|
}
|
||||||
|
const effectValue = risuChatParser(effect.value,{chara:char})
|
||||||
|
const varName = effect.inputVar
|
||||||
|
let promptbody:OpenAIChat[] = []
|
||||||
|
let currentRole:'user'|'assistant'|'system'
|
||||||
|
|
||||||
|
const splited = effectValue.split('\n')
|
||||||
|
|
||||||
|
for(let i = 0; i < splited.length; i++){
|
||||||
|
const line = splited[i]
|
||||||
|
if(line.startsWith('@@role ')){
|
||||||
|
const role = line.split(' ')[1]
|
||||||
|
switch(role){
|
||||||
|
case 'user':
|
||||||
|
case 'assistant':
|
||||||
|
case 'system':
|
||||||
|
currentRole = role
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
currentRole = 'system'
|
||||||
|
break
|
||||||
|
}
|
||||||
|
promptbody.push({role: currentRole, content: ''})
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
else if(promptbody.length === 0){
|
||||||
|
promptbody.push({role: 'system', content: line})
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
promptbody[promptbody.length - 1].content += line
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
promptbody = promptbody.map((e) => {
|
||||||
|
e.content = e.content.trim()
|
||||||
|
return e
|
||||||
|
}).filter((e) => e.content.length > 0)
|
||||||
|
|
||||||
|
const result = await requestChatData({
|
||||||
|
formated: promptbody,
|
||||||
|
bias: {},
|
||||||
|
useStreaming: false,
|
||||||
|
noMultiGen: true,
|
||||||
|
}, 'model')
|
||||||
|
|
||||||
|
if(result.type === 'fail' || result.type === 'streaming' || result.type === 'multiline'){
|
||||||
|
setVar(varName, 'Error: ' + result.result)
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
setVar(varName, result.result)
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'checkSimilarity':{
|
||||||
|
if(!lowLevelAccess){
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
const processer = new HypaProcesser('MiniLM')
|
||||||
|
const effectValue = risuChatParser(effect.value,{chara:char})
|
||||||
|
const source = risuChatParser(effect.source,{chara:char})
|
||||||
|
await processer.addText(effectValue.split('§'))
|
||||||
|
const val = await processer.similaritySearch(source)
|
||||||
|
setVar(effect.inputVar, val.join('§'))
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -305,6 +445,6 @@ export async function runTrigger(char:character,mode:triggerMode, arg:{
|
|||||||
currentChat.scriptstate = chat.scriptstate
|
currentChat.scriptstate = chat.scriptstate
|
||||||
}
|
}
|
||||||
|
|
||||||
return {additonalSysPrompt, chat, tokens:caculatedTokens, stopSending}
|
return {additonalSysPrompt, chat, tokens:caculatedTokens, stopSending, sendAIprompt}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -797,6 +797,7 @@ export interface character{
|
|||||||
ext: string
|
ext: string
|
||||||
}>
|
}>
|
||||||
defaultVariables?:string
|
defaultVariables?:string
|
||||||
|
lowLevelAccess?:boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -843,6 +844,7 @@ export interface groupChat{
|
|||||||
trashTime?:number
|
trashTime?:number
|
||||||
nickname?:string
|
nickname?:string
|
||||||
defaultVariables?:string
|
defaultVariables?:string
|
||||||
|
lowLevelAccess?:boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface botPreset{
|
export interface botPreset{
|
||||||
|
|||||||
Reference in New Issue
Block a user