[feat] continue response

This commit is contained in:
kwaroran
2023-08-17 17:00:10 +09:00
parent 64ee71e2c6
commit 4a66a585f7
9 changed files with 294 additions and 214 deletions

View File

@@ -415,4 +415,6 @@ export const languageEnglish = {
ToggleHypaMemory: "Toggle HypaMemory", ToggleHypaMemory: "Toggle HypaMemory",
resetPromptTemplateConfirm: "Do you really want to reset prompt template?", resetPromptTemplateConfirm: "Do you really want to reset prompt template?",
emotionMethod: "Emotion Method", emotionMethod: "Emotion Method",
continueResponse: "Continue Response",
showMenuChatList: "Show Menu Chat List",
} }

View File

@@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import Suggestion from './Suggestion.svelte'; import Suggestion from './Suggestion.svelte';
import { CameraIcon, DatabaseIcon, DicesIcon, GlobeIcon, LanguagesIcon, Laugh, MenuIcon, MicOffIcon, RefreshCcwIcon, ReplyIcon, Send } from "lucide-svelte"; import { CameraIcon, DatabaseIcon, DicesIcon, GlobeIcon, LanguagesIcon, Laugh, MenuIcon, MicOffIcon, RefreshCcwIcon, ReplyIcon, Send, StepForwardIcon } from "lucide-svelte";
import { CurrentCharacter, CurrentChat, CurrentUsername, selectedCharID, CurrentUserIcon, CurrentShowMemoryLimit,CurrentSimpleCharacter } from "../../ts/stores"; import { CurrentCharacter, CurrentChat, CurrentUsername, selectedCharID, CurrentUserIcon, CurrentShowMemoryLimit,CurrentSimpleCharacter } from "../../ts/stores";
import Chat from "./Chat.svelte"; import Chat from "./Chat.svelte";
import { DataBase, type Message, type character, type groupChat } from "../../ts/storage/database"; import { DataBase, type Message, type character, type groupChat } from "../../ts/storage/database";
@@ -20,12 +20,11 @@
import AssetInput from './AssetInput.svelte'; import AssetInput from './AssetInput.svelte';
import { downloadFile } from 'src/ts/storage/globalApi'; import { downloadFile } from 'src/ts/storage/globalApi';
import { runTrigger } from 'src/ts/process/triggers'; import { runTrigger } from 'src/ts/process/triggers';
import { v4 } from 'uuid'; import { v4 } from 'uuid';
let messageInput:string = '' let messageInput:string = ''
let messageInputTranslate:string = '' let messageInputTranslate:string = ''
let openMenu = false let openMenu = false
export let openChatList = false
let loadPages = 30 let loadPages = 30
let autoMode = false let autoMode = false
let rerolls:Message[][] = [] let rerolls:Message[][] = []
@@ -34,8 +33,16 @@
let doingChatInputTranslate = false let doingChatInputTranslate = false
let currentCharacter:character|groupChat = $CurrentCharacter let currentCharacter:character|groupChat = $CurrentCharacter
let toggleStickers:boolean = false let toggleStickers:boolean = false
export let openChatList:boolean = false
async function send() { async function send(){
return sendMain(false)
}
async function sendContinue(){
return sendMain(true)
}
async function sendMain(continueResponse:boolean) {
let selectedChar = $selectedCharID let selectedChar = $selectedCharID
console.log('send') console.log('send')
if($doingChat){ if($doingChat){
@@ -88,7 +95,7 @@
rerolls = [] rerolls = []
await sleep(10) await sleep(10)
updateInputSizeAll() updateInputSizeAll()
await sendChatMain() await sendChatMain(continueResponse)
} }
@@ -154,11 +161,14 @@
let abortController:null|AbortController = null let abortController:null|AbortController = null
async function sendChatMain(saveReroll = false) { async function sendChatMain(continued:boolean = false) {
messageInput = '' messageInput = ''
abortController = new AbortController() abortController = new AbortController()
try { try {
await sendChat(-1, {signal:abortController.signal}) await sendChat(-1, {
signal:abortController.signal,
continue:continued
})
} catch (error) { } catch (error) {
console.error(error) console.error(error)
alertError(`${error}`) alertError(`${error}`)
@@ -519,22 +529,31 @@
</div> </div>
{/if} {/if}
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" on:click={() => { <div class="flex items-center cursor-pointer hover:text-green-500 transition-colors"
openChatList = true class:text-textcolor2={($CurrentChat.message.length < 2) || ($CurrentChat.message[$CurrentChat.message.length - 1].role !== 'char')}
openMenu = false on:click={() => {
}}> if(($CurrentChat.message.length < 2) || ($CurrentChat.message[$CurrentChat.message.length - 1].role !== 'char')){
<DatabaseIcon /> return
<span class="ml-2">{language.chatList}</span> }
sendContinue();
}}
>
<StepForwardIcon />
<span class="ml-2">{language.continueResponse}</span>
</div> </div>
{#if $DataBase.translator !== ''}
<!-- <div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" on:click={async () => {
doingChatInputTranslate = true {#if $DataBase.showMenuChatList}
messageInput = (await translate(messageInput, true)) <div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" on:click={() => {
doingChatInputTranslate = false openChatList = true
openMenu = false
}}> }}>
<LanguagesIcon /> <DatabaseIcon />
<span class="ml-2">{language.translateInput}</span> <span class="ml-2">{language.chatList}</span>
</div> --> </div>
{/if}
{#if $DataBase.translator !== ''}
<div class={"flex items-center cursor-pointer "+ ($DataBase.useAutoTranslateInput ? 'text-green-500':'lg:hover:text-green-500')} on:click={() => { <div class={"flex items-center cursor-pointer "+ ($DataBase.useAutoTranslateInput ? 'text-green-500':'lg:hover:text-green-500')} on:click={() => {
$DataBase.useAutoTranslateInput = !$DataBase.useAutoTranslateInput $DataBase.useAutoTranslateInput = !$DataBase.useAutoTranslateInput
}}> }}>

View File

@@ -4,6 +4,7 @@
import { DataBase } from "src/ts/storage/database"; import { DataBase } from "src/ts/storage/database";
</script> </script>
<h2 class="mb-2 text-2xl font-bold mt-2">{language.accessibility}</h2> <h2 class="mb-2 text-2xl font-bold mt-2">{language.accessibility}</h2>
<div class="flex items-center mt-2"> <div class="flex items-center mt-2">
@@ -32,4 +33,8 @@
<div class="flex items-center mt-2"> <div class="flex items-center mt-2">
<Check bind:check={$DataBase.toggleConfirmRecommendedPreset} name={language.toggleConfirmRecommendedPreset}/> <Check bind:check={$DataBase.toggleConfirmRecommendedPreset} name={language.toggleConfirmRecommendedPreset}/>
</div>
<div class="flex items-center mt-2">
<Check bind:check={$DataBase.showMenuChatList} name={language.showMenuChatList}/>
</div> </div>

View File

@@ -36,7 +36,7 @@ export interface OpenAIChatFull extends OpenAIChat{
export const doingChat = writable(false) export const doingChat = writable(false)
export const abortChat = writable(false) export const abortChat = writable(false)
export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:number,signal?:AbortSignal} = {}):Promise<boolean> { export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:number,signal?:AbortSignal,continue?:boolean} = {}):Promise<boolean> {
const abortSignal = arg.signal ?? (new AbortController()).signal const abortSignal = arg.signal ?? (new AbortController()).signal
@@ -515,6 +515,14 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
formatOrder.push('postEverything') formatOrder.push('postEverything')
} }
//continue chat model
if(arg.continue && (db.aiModel.startsWith('claude') || db.aiModel.startsWith('gpt') || db.aiModel.startsWith('openrouter') || db.aiModel.startsWith('reverse_proxy'))){
unformated.postEverything.push({
role: 'system',
content: '[Continue the last response]'
})
}
function pushPrompts(cha:OpenAIChat[]){ function pushPrompts(cha:OpenAIChat[]){
for(const chat of cha){ for(const chat of cha){
@@ -670,19 +678,26 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
} }
else if(req.type === 'streaming'){ else if(req.type === 'streaming'){
const reader = req.result.getReader() const reader = req.result.getReader()
const msgIndex = db.characters[selectedChar].chats[selectedChat].message.length let msgIndex = db.characters[selectedChar].chats[selectedChat].message.length
let prefix = ''
if(arg.continue){
msgIndex -= 1
prefix = db.characters[selectedChar].chats[selectedChat].message[msgIndex].data
}
else{
db.characters[selectedChar].chats[selectedChat].message.push({
role: 'char',
data: "",
saying: currentChar.chaId,
time: Date.now()
})
}
db.characters[selectedChar].chats[selectedChat].isStreaming = true db.characters[selectedChar].chats[selectedChat].isStreaming = true
db.characters[selectedChar].chats[selectedChat].message.push({
role: 'char',
data: "",
saying: currentChar.chaId,
time: Date.now()
})
while(abortSignal.aborted === false){ while(abortSignal.aborted === false){
const readed = (await reader.read()) const readed = (await reader.read())
if(readed.value){ if(readed.value){
result = readed.value result = readed.value
const result2 = processScriptFull(nowChatroom, reformatContent(result), 'editoutput', msgIndex) const result2 = processScriptFull(nowChatroom, reformatContent(prefix + result), 'editoutput', msgIndex)
db.characters[selectedChar].chats[selectedChat].message[msgIndex].data = result2.data db.characters[selectedChar].chats[selectedChat].message[msgIndex].data = result2.data
emoChanged = result2.emoChanged emoChanged = result2.emoChanged
db.characters[selectedChar].reloadKeys += 1 db.characters[selectedChar].reloadKeys += 1
@@ -709,17 +724,33 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
const msgs = (req.type === 'success') ? [['char',req.result]] as const const msgs = (req.type === 'success') ? [['char',req.result]] as const
: (req.type === 'multiline') ? req.result : (req.type === 'multiline') ? req.result
: [] : []
for(const msg of msgs){ for(let i=0;i<msgs.length;i++){
const msgIndex = db.characters[selectedChar].chats[selectedChat].message.length const msg = msgs[i]
const result2 = processScriptFull(nowChatroom, reformatContent(msg[1]), 'editoutput', msgIndex) let msgIndex = db.characters[selectedChar].chats[selectedChat].message.length
let result2 = processScriptFull(nowChatroom, reformatContent(msg[1]), 'editoutput', msgIndex)
if(i === 0 && arg.continue){
msgIndex -= 1
let beforeChat = db.characters[selectedChar].chats[selectedChat].message[msgIndex]
result2 = processScriptFull(nowChatroom, reformatContent(beforeChat.data + msg[1]), 'editoutput', msgIndex)
}
result = result2.data result = result2.data
emoChanged = result2.emoChanged emoChanged = result2.emoChanged
db.characters[selectedChar].chats[selectedChat].message.push({ if(i === 0 && arg.continue){
role: msg[0], db.characters[selectedChar].chats[selectedChat].message[msgIndex] = {
data: result, role: 'char',
saying: currentChar.chaId, data: result,
time: Date.now() saying: currentChar.chaId,
}) time: Date.now()
}
}
else{
db.characters[selectedChar].chats[selectedChat].message.push({
role: msg[0],
data: result,
saying: currentChar.chaId,
time: Date.now()
})
}
db.characters[selectedChar].reloadKeys += 1 db.characters[selectedChar].reloadKeys += 1
await sayTTS(currentChar, result) await sayTTS(currentChar, result)
setDatabase(db) setDatabase(db)

View File

@@ -1,7 +1,7 @@
import { invoke } from "@tauri-apps/api/tauri"; import { invoke } from "@tauri-apps/api/tauri";
import { globalFetch } from "src/ts/storage/globalApi"; import { globalFetch } from "src/ts/storage/globalApi";
import { sleep } from "src/ts/util"; import { sleep } from "src/ts/util";
import path from "@tauri-apps/api/path"; import * as path from "@tauri-apps/api/path";
import { exists } from "@tauri-apps/api/fs"; import { exists } from "@tauri-apps/api/fs";
import { alertClear, alertError, alertMd, alertWait } from "src/ts/alert"; import { alertClear, alertError, alertMd, alertWait } from "src/ts/alert";
import { get } from "svelte/store"; import { get } from "svelte/store";

View File

@@ -5,7 +5,7 @@ import { globalFetch } from "src/ts/storage/globalApi"
import { alertError, alertInput, alertNormal, alertWait } from "src/ts/alert" import { alertError, alertInput, alertNormal, alertWait } from "src/ts/alert"
import { sleep } from "src/ts/util" import { sleep } from "src/ts/util"
export function stringlizeNAIChat(formated:OpenAIChat[], char:string = ''){ export function stringlizeNAIChat(formated:OpenAIChat[], char:string, continued: boolean){
const db = get(DataBase) const db = get(DataBase)
@@ -35,7 +35,12 @@ export function stringlizeNAIChat(formated:OpenAIChat[], char:string = ''){
} }
} }
return resultString.join(seperator) + `\n\n${char}:` let res = resultString.join(seperator)
if(!continued){
res += `\n\n${char}:`
}
return res
} }
export const novelLogin = async () => { export const novelLogin = async () => {

View File

@@ -23,6 +23,7 @@ interface requestDataArgument{
useStreaming?:boolean useStreaming?:boolean
isGroupChat?:boolean isGroupChat?:boolean
useEmotion?:boolean useEmotion?:boolean
continue?:boolean
} }
type requestDataResponse = { type requestDataResponse = {
@@ -90,6 +91,7 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
let temperature = arg.temperature ?? (db.temperature / 100) let temperature = arg.temperature ?? (db.temperature / 100)
let bias = arg.bias let bias = arg.bias
let currentChar = arg.currentChar let currentChar = arg.currentChar
arg.continue = arg.continue ?? false
let biasString = arg.biasString ?? [] let biasString = arg.biasString ?? []
const aiModel = (model === 'model' || (!db.advancedBotSettings)) ? db.aiModel : db.subModel const aiModel = (model === 'model' || (!db.advancedBotSettings)) ? db.aiModel : db.subModel
@@ -356,7 +358,7 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
} }
case 'novelai': case 'novelai':
case 'novelai_kayra':{ case 'novelai_kayra':{
const proompt = stringlizeNAIChat(formated, currentChar?.name ?? '') const proompt = stringlizeNAIChat(formated, currentChar?.name ?? '', arg.continue)
let logit_bias_exp:{ let logit_bias_exp:{
sequence: number[], bias: number, ensure_sequence_finish: false, generate_once: true sequence: number[], bias: number, ensure_sequence_finish: false, generate_once: true
}[] = [] }[] = []
@@ -439,7 +441,7 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
let blockingUrl = db.textgenWebUIBlockingURL.replace(/\/api.*/, "/api/v1/generate") let blockingUrl = db.textgenWebUIBlockingURL.replace(/\/api.*/, "/api/v1/generate")
let bodyTemplate:any let bodyTemplate:any
const suggesting = model === "submodel" const suggesting = model === "submodel"
const proompt = stringlizeChatOba(formated, currentChar.name, suggesting) const proompt = stringlizeChatOba(formated, currentChar.name, suggesting, arg.continue)
const stopStrings = getStopStrings(suggesting) const stopStrings = getStopStrings(suggesting)
console.log(proompt) console.log(proompt)
console.log(stopStrings) console.log(stopStrings)
@@ -583,7 +585,7 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
case 'palm2':{ case 'palm2':{
const body = { const body = {
"prompt": { "prompt": {
"text": stringlizeChat(formated, currentChar?.name ?? '') "text": stringlizeChat(formated, currentChar?.name ?? '', arg.continue)
}, },
"safetySettings":[ "safetySettings":[
{ {
@@ -654,7 +656,7 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
} }
} }
case "kobold":{ case "kobold":{
const proompt = stringlizeChat(formated, currentChar?.name ?? '') const proompt = stringlizeChat(formated, currentChar?.name ?? '', arg.continue)
const url = new URL(db.koboldURL) const url = new URL(db.koboldURL)
if(url.pathname.length < 3){ if(url.pathname.length < 3){
url.pathname = 'api/v1/generate' url.pathname = 'api/v1/generate'
@@ -704,7 +706,7 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
}; };
const send_body = { const send_body = {
text: stringlizeAINChat(formated, currentChar?.name ?? ''), text: stringlizeAINChat(formated, currentChar?.name ?? '', arg.continue),
length: maxTokens, length: maxTokens,
temperature: temperature, temperature: temperature,
top_p: db.ainconfig.top_p, top_p: db.ainconfig.top_p,
@@ -764,7 +766,7 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
const response = await createDeep([{ const response = await createDeep([{
role: 'user', role: 'user',
content: stringlizeChat(formated, currentChar?.name ?? '') content: stringlizeChat(formated, currentChar?.name ?? '', arg.continue)
}]) }])
if(!response.ok){ if(!response.ok){
@@ -862,7 +864,7 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
} }
if(aiModel.startsWith("horde:::")){ if(aiModel.startsWith("horde:::")){
const proompt = stringlizeChat(formated, currentChar?.name ?? '') const proompt = stringlizeChat(formated, currentChar?.name ?? '', arg.continue)
const realModel = aiModel.split(":::")[1] const realModel = aiModel.split(":::")[1]

View File

@@ -7,7 +7,7 @@ export function multiChatReplacer(){
} }
export function stringlizeChat(formated:OpenAIChat[], char:string = ''){ export function stringlizeChat(formated:OpenAIChat[], char:string, continued:boolean){
let resultString:string[] = [] let resultString:string[] = []
for(const form of formated){ for(const form of formated){
if(form.role === 'system'){ if(form.role === 'system'){
@@ -20,7 +20,12 @@ export function stringlizeChat(formated:OpenAIChat[], char:string = ''){
resultString.push(form.content) resultString.push(form.content)
} }
} }
return resultString.join('\n\n') + `\n\n${char}:` let res = resultString.join('\n\n')
if(!continued){
res += `\n\n${char}:`
}
return res
} }
function appendWhitespace(prefix:string, seperator:string=" ") { function appendWhitespace(prefix:string, seperator:string=" ") {
@@ -29,7 +34,7 @@ function appendWhitespace(prefix:string, seperator:string=" ") {
} }
return prefix return prefix
} }
export function stringlizeChatOba(formated:OpenAIChat[], characterName:string='', suggesting:boolean=false){ export function stringlizeChatOba(formated:OpenAIChat[], characterName:string, suggesting:boolean, continued:boolean){
const db = get(DataBase) const db = get(DataBase)
let resultString:string[] = [] let resultString:string[] = []
let { header, systemPrefix, userPrefix, assistantPrefix, seperator } = db.ooba.formating; let { header, systemPrefix, userPrefix, assistantPrefix, seperator } = db.ooba.formating;
@@ -59,10 +64,12 @@ export function stringlizeChatOba(formated:OpenAIChat[], characterName:string=''
} }
resultString.push(prefix + name + form.content) resultString.push(prefix + name + form.content)
} }
if (suggesting){ if(!continued){
resultString.push(appendWhitespace(assistantPrefix, seperator) + `${db.username}:\n` + db.autoSuggestPrefix) if (suggesting){
} else { resultString.push(appendWhitespace(assistantPrefix, seperator) + `${db.username}:\n` + db.autoSuggestPrefix)
resultString.push(assistantPrefix + `${characterName}:`) } else {
resultString.push(assistantPrefix + `${characterName}:`)
}
} }
return resultString.join(seperator) return resultString.join(seperator)
} }
@@ -190,7 +197,7 @@ export function getUnstringlizerChunks(formated:OpenAIChat[], char:string, mode:
return {chunks,extChunk:charNames.concat(chunks)} return {chunks,extChunk:charNames.concat(chunks)}
} }
export function stringlizeAINChat(formated:OpenAIChat[], char:string = ''){ export function stringlizeAINChat(formated:OpenAIChat[], char:string, continued: boolean){
let resultString:string[] = [] let resultString:string[] = []
const db = get(DataBase) const db = get(DataBase)
@@ -213,7 +220,14 @@ export function stringlizeAINChat(formated:OpenAIChat[], char:string = ''){
resultString.push(form.content) resultString.push(form.content)
} }
} }
return resultString.join('\n\n') + `\n\n${char}` let res = resultString.join('\n\n')
if(!continued){
res += + `\n\n${char}`
}
else{
res += " 「"
}
return res
} }
function extractAINOutputStrings(inputString:string, characters:string[]) { function extractAINOutputStrings(inputString:string, characters:string[]) {

View File

@@ -310,6 +310,164 @@ export function setDatabase(data:Database){
} }
export interface Database{
characters: (character|groupChat)[],
apiType: string
forceReplaceUrl2:string
openAIKey: string
proxyKey:string
mainPrompt: string
jailbreak: string
globalNote:string
temperature: number
askRemoval:boolean
maxContext: number
maxResponse: number
frequencyPenalty: number
PresensePenalty: number
formatingOrder: FormatingOrderItem[]
aiModel: string
jailbreakToggle:boolean
loreBookDepth: number
loreBookToken: number,
loreBook: {
name:string
data:loreBook[]
}[]
loreBookPage: number
supaMemoryPrompt: string
username: string
userIcon: string
additionalPrompt: string
descriptionPrefix: string
forceReplaceUrl: string
language: string
translator: string
plugins: RisuPlugin[]
officialplugins: {
automark?: boolean
}
currentPluginProvider: string
zoomsize:number
lastup:string
customBackground:string
textgenWebUIStreamURL:string
textgenWebUIBlockingURL:string
autoTranslate: boolean
fullScreen:boolean
playMessage:boolean
iconsize:number
theme: string
subModel:string
timeOut:number
emotionPrompt: string,
requester:string
formatversion:number
waifuWidth:number
waifuWidth2:number
botPresets:botPreset[]
botPresetsId:number
sdProvider: string
webUiUrl:string
sdSteps:number
sdCFG:number
sdConfig:sdConfig
runpodKey:string
promptPreprocess:boolean
bias: [string, number][]
swipe:boolean
instantRemove:boolean
textTheme: string
customTextTheme: {
FontColorStandard: string,
FontColorBold : string,
FontColorItalic : string,
FontColorItalicBold : string,
}
requestRetrys:number
emotionPrompt2:string
useSayNothing:boolean
didFirstSetup: boolean
requestmet: string
requestproxy: string
showUnrecommended:boolean
elevenLabKey:string
voicevoxUrl:string
useExperimental:boolean
showMemoryLimit:boolean
roundIcons:boolean
useStreaming:boolean
palmAPI:string,
supaMemoryKey:string
supaMemoryType:string
textScreenColor?:string
textBorder?:boolean
textScreenRounded?:boolean
textScreenBorder?:string
characterOrder:(string|folder)[]
hordeConfig:hordeConfig,
toggleConfirmRecommendedPreset:boolean,
novelai:{
token:string,
model:string
}
globalscript: customscript[],
sendWithEnter:boolean
clickToEdit: boolean
koboldURL:string
advancedBotSettings:boolean
useAutoSuggestions:boolean
autoSuggestPrompt:string
autoSuggestPrefix:string
autoSuggestClean:boolean
claudeAPIKey:string,
useChatCopy:boolean,
novellistAPI:string,
useAutoTranslateInput:boolean
imageCompression:boolean
account?:{
token:string
id:string,
data: {
refresh_token?:string,
access_token?:string
expires_in?: number
}
useSync?:boolean
},
classicMaxWidth: boolean,
useChatSticker:boolean,
useAdditionalAssetsPreview:boolean,
usePlainFetch:boolean
hypaMemory:boolean
proxyRequestModel:string
ooba:OobaSettings
ainconfig: AINsettings
personaPrompt:string
openrouterRequestModel:string
openrouterKey:string
selectedPersona:number
personas:{
personaPrompt:string
name:string
icon:string
}[]
assetWidth:number
animationSpeed:number
botSettingAtStart:false
NAIsettings:NAISettings
hideRealm:boolean
colorScheme:ColorScheme
colorSchemeName:string
promptTemplate?:Proompt[]
forceProxyAsOpenAI?:boolean
hypaModel:'ada'|'MiniLM'
saveTime?:number
mancerHeader:string
emotionProcesser:'submodel'|'embedding',
showMenuChatList?:boolean
}
export interface customscript{ export interface customscript{
comment: string; comment: string;
in:string in:string
@@ -470,162 +628,6 @@ export interface botPreset{
promptTemplate?:Proompt[] promptTemplate?:Proompt[]
} }
export interface Database{
characters: (character|groupChat)[],
apiType: string
forceReplaceUrl2:string
openAIKey: string
proxyKey:string
mainPrompt: string
jailbreak: string
globalNote:string
temperature: number
askRemoval:boolean
maxContext: number
maxResponse: number
frequencyPenalty: number
PresensePenalty: number
formatingOrder: FormatingOrderItem[]
aiModel: string
jailbreakToggle:boolean
loreBookDepth: number
loreBookToken: number,
loreBook: {
name:string
data:loreBook[]
}[]
loreBookPage: number
supaMemoryPrompt: string
username: string
userIcon: string
additionalPrompt: string
descriptionPrefix: string
forceReplaceUrl: string
language: string
translator: string
plugins: RisuPlugin[]
officialplugins: {
automark?: boolean
}
currentPluginProvider: string
zoomsize:number
lastup:string
customBackground:string
textgenWebUIStreamURL:string
textgenWebUIBlockingURL:string
autoTranslate: boolean
fullScreen:boolean
playMessage:boolean
iconsize:number
theme: string
subModel:string
timeOut:number
emotionPrompt: string,
requester:string
formatversion:number
waifuWidth:number
waifuWidth2:number
botPresets:botPreset[]
botPresetsId:number
sdProvider: string
webUiUrl:string
sdSteps:number
sdCFG:number
sdConfig:sdConfig
runpodKey:string
promptPreprocess:boolean
bias: [string, number][]
swipe:boolean
instantRemove:boolean
textTheme: string
customTextTheme: {
FontColorStandard: string,
FontColorBold : string,
FontColorItalic : string,
FontColorItalicBold : string,
}
requestRetrys:number
emotionPrompt2:string
useSayNothing:boolean
didFirstSetup: boolean
requestmet: string
requestproxy: string
showUnrecommended:boolean
elevenLabKey:string
voicevoxUrl:string
useExperimental:boolean
showMemoryLimit:boolean
roundIcons:boolean
useStreaming:boolean
palmAPI:string,
supaMemoryKey:string
supaMemoryType:string
textScreenColor?:string
textBorder?:boolean
textScreenRounded?:boolean
textScreenBorder?:string
characterOrder:(string|folder)[]
hordeConfig:hordeConfig,
toggleConfirmRecommendedPreset:boolean,
novelai:{
token:string,
model:string
}
globalscript: customscript[],
sendWithEnter:boolean
clickToEdit: boolean
koboldURL:string
advancedBotSettings:boolean
useAutoSuggestions:boolean
autoSuggestPrompt:string
autoSuggestPrefix:string
autoSuggestClean:boolean
claudeAPIKey:string,
useChatCopy:boolean,
novellistAPI:string,
useAutoTranslateInput:boolean
imageCompression:boolean
account?:{
token:string
id:string,
data: {
refresh_token?:string,
access_token?:string
expires_in?: number
}
useSync?:boolean
},
classicMaxWidth: boolean,
useChatSticker:boolean,
useAdditionalAssetsPreview:boolean,
usePlainFetch:boolean
hypaMemory:boolean
proxyRequestModel:string
ooba:OobaSettings
ainconfig: AINsettings
personaPrompt:string
openrouterRequestModel:string
openrouterKey:string
selectedPersona:number
personas:{
personaPrompt:string
name:string
icon:string
}[]
assetWidth:number
animationSpeed:number
botSettingAtStart:false
NAIsettings:NAISettings
hideRealm:boolean
colorScheme:ColorScheme
colorSchemeName:string
promptTemplate?:Proompt[]
forceProxyAsOpenAI?:boolean
hypaModel:'ada'|'MiniLM'
saveTime?:number
mancerHeader:string
emotionProcesser:'submodel'|'embedding'
}
interface hordeConfig{ interface hordeConfig{
apiKey:string apiKey:string