From daa9ed79c8cf9e621e9f9b4be7e4983b89839749 Mon Sep 17 00:00:00 2001 From: Bo26fhmC5M <88071760+Bo26fhmC5M@users.noreply.github.com> Date: Sat, 30 Nov 2024 08:53:55 +0900 Subject: [PATCH 1/8] Fix issue where cache misses occur when translateBeforeHTMLFormatting is disabled. --- src/lib/ChatScreens/Chat.svelte | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/lib/ChatScreens/Chat.svelte b/src/lib/ChatScreens/Chat.svelte index 1f5995d1..bbda6697 100644 --- a/src/lib/ChatScreens/Chat.svelte +++ b/src/lib/ChatScreens/Chat.svelte @@ -140,11 +140,12 @@ translateText = false try { if(DBState.db.autoTranslate){ - if(DBState.db.autoTranslateCachedOnly && DBState.db.translatorType === "llm"){ - const cache = await getLLMCache(data) - if(cache !== null){ - translateText = true - } + if(DBState.db.autoTranslateCachedOnly && DBState.db.translatorType === 'llm'){ + const cache = DBState.db.translateBeforeHTMLFormatting + ? await getLLMCache(data) + : await getLLMCache(await ParseMarkdown(data, charArg, 'pretranslate', chatID, getCbsCondition())) + + translateText = cache !== null } else{ translateText = true From 7c6ab023d1970ed0d17fdfef8759a8d59d3737dc Mon Sep 17 00:00:00 2001 From: Bo26fhmC5M <88071760+Bo26fhmC5M@users.noreply.github.com> Date: Sat, 30 Nov 2024 11:16:47 +0900 Subject: [PATCH 2/8] Fix translation issue in input auto-translation field. --- src/ts/translator/translator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ts/translator/translator.ts b/src/ts/translator/translator.ts index 156db65d..b8ce3041 100644 --- a/src/ts/translator/translator.ts +++ b/src/ts/translator/translator.ts @@ -111,7 +111,7 @@ export async function runTranslator(text:string, reverse:boolean, from:string,ta async function translateMain(text:string, arg:{from:string, to:string, host:string}){ let db = getDatabase() if(db.translatorType === 'llm'){ - const tr = db.translator || 'en' + const tr = arg.to || 'en' return translateLLM(text, {to: tr}) } if(db.translatorType === 'deepl'){ From 8a6cfedcda49601cc529b7dbee0b0319dd79f287 Mon Sep 17 00:00:00 2001 From: kwaroran Date: Sun, 1 Dec 2024 17:05:50 +0900 Subject: [PATCH 3/8] Add ChatML and Rework display --- src/lib/UI/PromptDataItem.svelte | 293 ++++++++++++++++++++++--------- src/ts/parser.svelte.ts | 2 +- src/ts/process/index.svelte.ts | 11 ++ src/ts/process/prompt.ts | 14 +- 4 files changed, 234 insertions(+), 86 deletions(-) diff --git a/src/lib/UI/PromptDataItem.svelte b/src/lib/UI/PromptDataItem.svelte index 2a270abb..ec7c1f3c 100644 --- a/src/lib/UI/PromptDataItem.svelte +++ b/src/lib/UI/PromptDataItem.svelte @@ -10,6 +10,7 @@ import TextInput from "./GUI/TextInput.svelte"; import { DBState } from 'src/ts/stores.svelte'; + let opened = $state(false) interface Props { promptItem: PromptItem; onRemove?: () => void; @@ -36,101 +37,227 @@ promptItem = currentprompt } - + function getName(promptItem:PromptItem){ -
- - - - - - {language.type} - - { - if(promptItem.type === 'plain' || promptItem.type === 'jailbreak' || promptItem.type === 'cot'){ - promptItem.text = "" - promptItem.role = "system" + if(promptItem.name){ + return promptItem.name + } + + if(promptItem.type === 'plain'){ + return language.formating.plain + } + if(promptItem.type === 'jailbreak'){ + return language.formating.jailbreak } if(promptItem.type === 'chat'){ - promptItem.rangeStart = -1000 - promptItem.rangeEnd = 'end' + return language.Chat } - }} > - {language.formating.plain} - {language.formating.jailbreak} - {language.Chat} - {language.formating.personaPrompt} - {language.formating.description} - {language.formating.authorNote} - {language.formating.lorebook} - {language.formating.memory} - {language.formating.postEverything} - {#if DBState.db.promptSettings.customChainOfThought} - {language.cot} - {/if} - + if(promptItem.type === 'persona'){ + return language.formating.personaPrompt + } + if(promptItem.type === 'description'){ + return language.formating.description + } + if(promptItem.type === 'authornote'){ + return language.formating.authorNote + } + if(promptItem.type === 'lorebook'){ + return language.formating.lorebook + } + if(promptItem.type === 'memory'){ + return language.formating.memory + } + if(promptItem.type === 'postEverything'){ + return language.formating.postEverything + } + if(promptItem.type === 'cot'){ + return language.cot + } + if(promptItem.type === 'chatML'){ + return 'ChatML' + } + return "" + } - {#if promptItem.type === 'plain' || promptItem.type === 'jailbreak' || promptItem.type === 'cot'} - {language.specialType} - - {language.noSpecialType} - {language.mainPrompt} - {language.globalNote} + function replacePrompt(prompt:PromptItem){ + if(JSON.stringify(promptItem) === JSON.stringify(prompt)){ + return + } + + const ind = DBState.db.promptTemplate.findIndex((item, index) => { + return JSON.stringify(item) === JSON.stringify(prompt) + }) + + if(ind !== -1){ + DBState.db.promptTemplate[ind] = promptItem + promptItem = prompt + } + else{ + const myInd = DBState.db.promptTemplate.findIndex((item, index) => { + return JSON.stringify(item) === JSON.stringify(promptItem) + }) + DBState.db.promptTemplate.splice(myInd, 0, prompt) + } + + } + + + +
{ + e.preventDefault() + e.stopPropagation() + const data = e.dataTransfer.getData('text') + if(data === 'prompt'){ + const prompt = JSON.parse(e.dataTransfer.getData('prompt')) + replacePrompt(prompt) + } +}} ondragover={(e) => { + e.preventDefault() +}} draggable="true" ondragstart={(e) => { + e.dataTransfer.setData('text', 'prompt') + e.dataTransfer.setData('prompt', JSON.stringify(promptItem)) +}}> + +
+ +
{ + e.preventDefault() + }} + ondrop={(e) => { + e.preventDefault() + const data = e.dataTransfer.getData('text') + if(data === 'prompt'){ + const prompt = JSON.parse(e.dataTransfer.getData('prompt')) + replacePrompt(prompt) + } + }} + draggable={opened ? false : true} + ondragstart={(e) => { + e.dataTransfer.setData('text', 'prompt') + e.dataTransfer.setData('prompt', JSON.stringify(promptItem)) + }} +> + +
{ + opened = !opened + }}> + {getName(promptItem)} +
+ + + +
+
+ {#if opened} + + + {language.name} + + {language.type} + { + if(promptItem.type === 'plain' || promptItem.type === 'jailbreak' || promptItem.type === 'cot'){ + promptItem.text = "" + promptItem.role = "system" + } + if(promptItem.type === 'chat'){ + promptItem.rangeStart = -1000 + promptItem.rangeEnd = 'end' + } + }} > + {language.formating.plain} + {language.formating.jailbreak} + {language.Chat} + {language.formating.personaPrompt} + {language.formating.description} + {language.formating.authorNote} + {language.formating.lorebook} + {language.formating.memory} + {language.formating.postEverything} + {"chatML"} + + {#if DBState.db.promptSettings.customChainOfThought} + {language.cot} + {/if} - {language.prompt} - - {language.role} - - {language.user} - {language.character} - {language.systemPrompt} - - {/if} - {#if promptItem.type === 'chat'} - {#if promptItem.rangeStart !== -1000} - {language.rangeStart} - - {language.rangeEnd} - {#if promptItem.rangeEnd === 'end'} - - { - if(promptItem.type === 'chat'){ - promptItem.rangeEnd = 0 + + {#if promptItem.type === 'plain' || promptItem.type === 'jailbreak' || promptItem.type === 'cot'} + {language.specialType} + + {language.noSpecialType} + {language.mainPrompt} + {language.globalNote} + + {language.prompt} + + {language.role} + + {language.user} + {language.character} + {language.systemPrompt} + + {/if} + {#if promptItem.type === 'chatML'} + {language.prompt} + + {/if} + {#if promptItem.type === 'chat'} + {#if promptItem.rangeStart !== -1000} + {language.rangeStart} + + {language.rangeEnd} + {#if promptItem.rangeEnd === 'end'} + + { + if(promptItem.type === 'chat'){ + promptItem.rangeEnd = 0 + } + }} /> + {:else} + + { + if(promptItem.type === 'chat'){ + promptItem.rangeEnd = 'end' + } + }} /> + {/if} + {#if DBState.db.promptSettings.sendChatAsSystem} + + {/if} + {/if} + + {/if} + {#if promptItem.type === 'authornote'} + {language.defaultPrompt} + + {/if} + {#if promptItem.type === 'persona' || promptItem.type === 'description' || promptItem.type === 'authornote' || promptItem.type === 'memory'} + {#if !promptItem.innerFormat} + { + if(promptItem.type === 'persona' || promptItem.type === 'description' || promptItem.type === 'authornote' || promptItem.type === 'memory'){ + promptItem.innerFormat = "{{slot}}" } }} /> {:else} - - { - if(promptItem.type === 'chat'){ - promptItem.rangeEnd = 'end' + {language.innerFormat} + + { + if(promptItem.type === 'persona' || promptItem.type === 'description' || promptItem.type === 'authornote' || promptItem.type === 'memory'){ + promptItem.innerFormat = null } }} /> {/if} - {#if DBState.db.promptSettings.sendChatAsSystem} - - {/if} - {/if} - - {/if} - {#if promptItem.type === 'authornote'} - {language.defaultPrompt} - - {/if} - {#if promptItem.type === 'persona' || promptItem.type === 'description' || promptItem.type === 'authornote' || promptItem.type === 'memory'} - {#if !promptItem.innerFormat} - { - if(promptItem.type === 'persona' || promptItem.type === 'description' || promptItem.type === 'authornote' || promptItem.type === 'memory'){ - promptItem.innerFormat = "{{slot}}" - } - }} /> - {:else} - {language.innerFormat} - - { - if(promptItem.type === 'persona' || promptItem.type === 'description' || promptItem.type === 'authornote' || promptItem.type === 'memory'){ - promptItem.innerFormat = null - } - }} /> {/if} {/if}
\ No newline at end of file diff --git a/src/ts/parser.svelte.ts b/src/ts/parser.svelte.ts index 82ec755e..d356d92e 100644 --- a/src/ts/parser.svelte.ts +++ b/src/ts/parser.svelte.ts @@ -2280,7 +2280,7 @@ export function parseChatML(data:string):OpenAIChat[]|null{ return { role: role, - content: v + content: risuChatParser(v) } }) } diff --git a/src/ts/process/index.svelte.ts b/src/ts/process/index.svelte.ts index 47dcfd44..b6f73e64 100644 --- a/src/ts/process/index.svelte.ts +++ b/src/ts/process/index.svelte.ts @@ -28,6 +28,7 @@ import { runImageEmbedding } from "./transformers"; import { hanuraiMemory } from "./memory/hanuraiMemory"; import { hypaMemoryV2 } from "./memory/hypav2"; import { runLuaEditTrigger } from "./lua"; +import { parseChatML } from "../parser.svelte"; export interface OpenAIChat{ role: 'system'|'user'|'assistant'|'function' @@ -548,6 +549,11 @@ export async function sendChat(chatProcessIndex = -1,arg:{ await tokenizeChatArray([prompt]) break } + case 'chatML':{ + let prompts = parseChatML(card.text) + await tokenizeChatArray(prompts) + break + } case 'chat':{ let start = card.rangeStart let end = (card.rangeEnd === 'end') ? unformated.chats.length : card.rangeEnd @@ -1007,6 +1013,11 @@ export async function sendChat(chatProcessIndex = -1,arg:{ pushPrompts([prompt]) break } + case 'chatML':{ + let prompts = parseChatML(card.text) + pushPrompts(prompts) + break + } case 'chat':{ let start = card.rangeStart let end = (card.rangeEnd === 'end') ? unformated.chats.length : card.rangeEnd diff --git a/src/ts/process/prompt.ts b/src/ts/process/prompt.ts index a5e764f1..89c49dd2 100644 --- a/src/ts/process/prompt.ts +++ b/src/ts/process/prompt.ts @@ -4,7 +4,7 @@ import { getDatabase, presetTemplate, setDatabase, type Database } from "../stor import { alertError, alertNormal } from "../alert"; import type { OobaChatCompletionRequestParams } from "../model/ooba"; -export type PromptItem = PromptItemPlain|PromptItemTyped|PromptItemChat|PromptItemAuthorNote; +export type PromptItem = PromptItemPlain|PromptItemTyped|PromptItemChat|PromptItemAuthorNote|PromptItemChatML export type PromptType = PromptItem['type']; export type PromptSettings = { assistantPrefill: string @@ -21,17 +21,26 @@ export interface PromptItemPlain { type2: 'normal'|'globalNote'|'main' text: string; role: 'user'|'bot'|'system'; + name?: string +} + +export interface PromptItemChatML { + type: 'chatML' + text: string + name?: string } export interface PromptItemTyped { type: 'persona'|'description'|'lorebook'|'postEverything'|'memory' - innerFormat?: string + innerFormat?: string, + name?: string } export interface PromptItemAuthorNote { type : 'authornote' innerFormat?: string defaultText?: string + name?: string } @@ -40,6 +49,7 @@ export interface PromptItemChat { rangeStart: number; rangeEnd: number|'end'; chatAsOriginalOnSystem?: boolean; + name?: string } export async function tokenizePreset(prompts:PromptItem[], consti:boolean = false){ From 6231192dca89a34b86962b401e0237eed129b492 Mon Sep 17 00:00:00 2001 From: kwaroran Date: Sun, 1 Dec 2024 17:15:02 +0900 Subject: [PATCH 4/8] Fix CBS --- src/ts/parser.svelte.ts | 78 ++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/src/ts/parser.svelte.ts b/src/ts/parser.svelte.ts index d356d92e..49282c69 100644 --- a/src/ts/parser.svelte.ts +++ b/src/ts/parser.svelte.ts @@ -720,7 +720,7 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string if(achara.type === 'group'){ return "" } - return achara.personality + return risuChatParser(achara.personality, matcherArg) } case 'description': case 'char_desc':{ @@ -729,7 +729,7 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string if(achara.type === 'group'){ return "" } - return achara.desc + return risuChatParser(achara.desc, matcherArg) } case 'scenario':{ const argChara = chara @@ -737,7 +737,7 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string if(achara.type === 'group'){ return "" } - return achara.scenario + return risuChatParser(achara.scenario, matcherArg) } case 'example_dialogue': case 'example_message':{ @@ -746,15 +746,15 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string if(achara.type === 'group'){ return "" } - return achara.exampleMessage + return risuChatParser(achara.exampleMessage, matcherArg) } case 'persona': case 'user_persona':{ - return getPersonaPrompt() + return risuChatParser(getPersonaPrompt(), matcherArg) } case 'main_prompt': case 'system_prompt':{ - return db.mainPrompt + return risuChatParser(db.mainPrompt, matcherArg) } case 'lorebook': case 'world_info':{ @@ -765,44 +765,47 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string const characterLore = (achara.type === 'group') ? [] : (achara.globalLore ?? []) const chatLore = chat.localLore ?? [] const fullLore = characterLore.concat(chatLore.concat(getModuleLorebooks())) - return fullLore.map((f) => { - return JSON.stringify(f) - }).join("§\n") + return makeArray(fullLore.map((v) => { + return JSON.stringify(v) + })) } case 'history': case 'messages':{ const selchar = db.characters[get(selectedCharID)] const chat = selchar.chats[selchar.chatPage] - return chat.message.map((f) => { - return f.role + ': ' + f.data - }).join("§\n") + return makeArray(chat.message.concat([{ + role: 'char', + data: chat.fmIndex === -1 ? selchar.firstMessage : selchar.alternateGreetings[chat.fmIndex] + }]).map((v) => { + v = safeStructuredClone(v) + v.data = risuChatParser(v.data, matcherArg) + return JSON.stringify(v) + })) } case 'user_history': case 'user_messages':{ const selchar = db.characters[get(selectedCharID)] const chat = selchar.chats[selchar.chatPage] - return chat.message.map((f) => { - if(f.role === 'user'){ - return f.data - } - return '' - }).filter((f) => { - return f !== '' - }).join("§\n") + return makeArray(chat.message.filter((v) => { + return v.role === 'user' + }).map((v) => { + v = safeStructuredClone(v) + v.data = risuChatParser(v.data, matcherArg) + return JSON.stringify(v) + })) } case 'char_history': case 'char_messages':{ const selchar = db.characters[get(selectedCharID)] const chat = selchar.chats[selchar.chatPage] - return chat.message.map((f) => { - if(f.role === 'char'){ - return f.data - } - return '' - }).filter((f) => { - return f !== '' - }).join("§\n") + return makeArray(chat.message.filter((v) => { + return v.role === 'char' + }).map((v) => { + v = safeStructuredClone(v) + v.data = risuChatParser(v.data, matcherArg) + return JSON.stringify(v) + })) } case 'ujb': case 'global_note': @@ -1038,9 +1041,9 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string if(!selchar || selchar.type === 'group'){ return '' } - return selchar.additionalAssets?.map((f) => { + return makeArray(selchar.additionalAssets?.map((f) => { return f[0] - })?.join('§') ?? '' + })) } case 'prefill_supported':{ return db.aiModel.startsWith('claude') ? '1' : '0' @@ -1286,7 +1289,9 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string } case 'arraypush': case 'array_push':{ - return arra[1] + '§' + arra[2] + const arr = parseArray(arra[1]) + arr.push(arra[2]) + return makeArray(arr) } case 'arraysplice': case 'array_splice':{ @@ -1351,14 +1356,13 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string const start = arr.length > 1 ? Number(arr[0]) : 0 const end = arr.length > 1 ? Number(arr[1]) : Number(arr[0]) const step = arr.length > 2 ? Number(arr[2]) : 1 - let out = '' + let out:string[] = [] + for(let i=start;i Date: Sun, 1 Dec 2024 17:16:45 +0900 Subject: [PATCH 5/8] Add support for 'jb' --- src/ts/parser.svelte.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ts/parser.svelte.ts b/src/ts/parser.svelte.ts index 49282c69..e8d5d3b8 100644 --- a/src/ts/parser.svelte.ts +++ b/src/ts/parser.svelte.ts @@ -807,10 +807,14 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string return JSON.stringify(v) })) } + case 'jb': + case 'jailbreak':{ + return risuChatParser(db.jailbreak, matcherArg) + } case 'ujb': case 'global_note': case 'system_note':{ - return db.globalNote + return risuChatParser(db.globalNote, matcherArg) } case 'chat_index':{ return chatID.toString() From 227a11815f23a46d57f39d3c9a9af7ffdc772149 Mon Sep 17 00:00:00 2001 From: kwaroran Date: Sun, 1 Dec 2024 17:25:15 +0900 Subject: [PATCH 6/8] Improve parser --- src/ts/parser.svelte.ts | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/ts/parser.svelte.ts b/src/ts/parser.svelte.ts index e8d5d3b8..71dbe1f3 100644 --- a/src/ts/parser.svelte.ts +++ b/src/ts/parser.svelte.ts @@ -411,7 +411,7 @@ export async function ParseMarkdown( if(firstParsed !== data && char && char.type !== 'group'){ data = await parseAdditionalAssets(data, char, additionalAssetMode, 'post') } - data = await parseInlayImages(data) + data = await parseInlayImages(data ?? '') data = encodeStyle(data) if(mode === 'normal'){ @@ -773,10 +773,10 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string case 'messages':{ const selchar = db.characters[get(selectedCharID)] const chat = selchar.chats[selchar.chatPage] - return makeArray(chat.message.concat([{ + return makeArray([{ role: 'char', data: chat.fmIndex === -1 ? selchar.firstMessage : selchar.alternateGreetings[chat.fmIndex] - }]).map((v) => { + }].concat(chat.message).map((v) => { v = safeStructuredClone(v) v.data = risuChatParser(v.data, matcherArg) return JSON.stringify(v) @@ -1735,7 +1735,11 @@ function blockStartMatcher(p1:string,matcherArg:matcherArg):{type:blockMatch,typ return {type:'pure-display'} } if(p1.startsWith('#each')){ - return {type:'each',type2:p1.substring(5).trim()} + let t2 = p1.substring(5).trim() + if(t2.startsWith('as ')){ + t2 = t2.substring(3).trim() + } + return {type:'each',type2:t2} } if(p1.startsWith('#func')){ const statement = p1.split(' ') @@ -1839,6 +1843,12 @@ export function risuChatParser(da:string, arg:{ arg:string[] }> = arg.functions ?? (new Map()) + arg.callStack = (arg.callStack ?? 0) + 1 + + if(arg.callStack > 20){ + return 'ERROR: Call stack limit reached' + } + const matcherObj = { chatID: chatID, chara: chara, @@ -1850,7 +1860,8 @@ export function risuChatParser(da:string, arg:{ role: arg.role, runVar: arg.runVar ?? false, consistantChar: arg.consistantChar ?? false, - cbsConditions: arg.cbsConditions ?? {} + cbsConditions: arg.cbsConditions ?? {}, + callStack: arg.callStack, } @@ -1979,7 +1990,7 @@ export function risuChatParser(da:string, arg:{ } } if(dat.startsWith('call::')){ - if(arg.callStack && arg.callStack > 10){ + if(arg.callStack && arg.callStack > 20){ nested[0] += `ERROR: Call stack limit reached` break } @@ -1993,7 +2004,6 @@ export function risuChatParser(da:string, arg:{ data = data.replaceAll(`{{arg::${i}}}`, argData[i]) } arg.functions = functions - arg.callStack = (arg.callStack ?? 0) + 1 nested[0] += risuChatParser(data, arg) break } From 5499368ac0885c731c6ddbc25d170800b6acbd37 Mon Sep 17 00:00:00 2001 From: kwaroran Date: Sun, 1 Dec 2024 18:08:06 +0900 Subject: [PATCH 7/8] Fix version numbers --- src-tauri/tauri.conf.json | 2 +- src/lib/UI/PromptDataItem.svelte | 13 +++++-------- src/ts/storage/database.svelte.ts | 2 +- version.json | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 8b4e30ae..910f4cda 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -29,7 +29,7 @@ }, "productName": "RisuAI", "mainBinaryName": "RisuAI", - "version": "140.1.0", + "version": "141.0.0", "identifier": "co.aiclient.risu", "plugins": { "updater": { diff --git a/src/lib/UI/PromptDataItem.svelte b/src/lib/UI/PromptDataItem.svelte index ec7c1f3c..c1b2656d 100644 --- a/src/lib/UI/PromptDataItem.svelte +++ b/src/lib/UI/PromptDataItem.svelte @@ -89,15 +89,12 @@ }) if(ind !== -1){ - DBState.db.promptTemplate[ind] = promptItem - promptItem = prompt - } - else{ - const myInd = DBState.db.promptTemplate.findIndex((item, index) => { - return JSON.stringify(item) === JSON.stringify(promptItem) - }) - DBState.db.promptTemplate.splice(myInd, 0, prompt) + DBState.db.promptTemplate.splice(ind, 1) } + const myInd = DBState.db.promptTemplate.findIndex((item, index) => { + return JSON.stringify(item) === JSON.stringify(promptItem) + }) + DBState.db.promptTemplate.splice(myInd, 0, prompt) } diff --git a/src/ts/storage/database.svelte.ts b/src/ts/storage/database.svelte.ts index cb3187a1..ec6de12c 100644 --- a/src/ts/storage/database.svelte.ts +++ b/src/ts/storage/database.svelte.ts @@ -12,7 +12,7 @@ import { defaultColorScheme, type ColorScheme } from '../gui/colorscheme'; import type { PromptItem, PromptSettings } from '../process/prompt'; import type { OobaChatCompletionRequestParams } from '../model/ooba'; -export let appVer = "140.1.0" +export let appVer = "141.0.0" export let webAppSubVer = '' diff --git a/version.json b/version.json index 410941cf..9e7a354d 100644 --- a/version.json +++ b/version.json @@ -1 +1 @@ -{"version":"140.1.0"} \ No newline at end of file +{"version":"141.0.0"} \ No newline at end of file From ca57244153ca98f2f529c42deeddbe15bc1c025b Mon Sep 17 00:00:00 2001 From: kwaroran Date: Sun, 1 Dec 2024 18:09:36 +0900 Subject: [PATCH 8/8] Add alertClear to imports and update error handling in Chat.svelte --- src/lib/ChatScreens/Chat.svelte | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lib/ChatScreens/Chat.svelte b/src/lib/ChatScreens/Chat.svelte index 1f5995d1..8c7bbab6 100644 --- a/src/lib/ChatScreens/Chat.svelte +++ b/src/lib/ChatScreens/Chat.svelte @@ -2,7 +2,7 @@ import { ArrowLeft, Sparkles, ArrowRight, PencilIcon, LanguagesIcon, RefreshCcwIcon, TrashIcon, CopyIcon, Volume2Icon, BotIcon, ArrowLeftRightIcon, UserIcon } from "lucide-svelte"; import { type CbsConditions, ParseMarkdown, postTranslationParse, type simpleCharacterArgument } from "../../ts/parser.svelte"; import AutoresizeArea from "../UI/GUI/TextAreaResizable.svelte"; - import { alertConfirm, alertError, alertNormal, alertRequestData, alertWait } from "../../ts/alert"; + import { alertClear, alertConfirm, alertError, alertNormal, alertRequestData, alertWait } from "../../ts/alert"; import { language } from "../../lang"; import { type MessageGenerationInfo } from "../../ts/storage/database.svelte"; import { alertStore, DBState } from 'src/ts/stores.svelte'; @@ -430,7 +430,10 @@ return } catch (e) { - alertError(`Error, please try again: ${e.message}`) + alertClear() + window.navigator.clipboard.writeText(msgDisplay).then(() => { + setStatusMessage(language.copied) + }) } } window.navigator.clipboard.writeText(msgDisplay).then(() => {