diff --git a/src/App.svelte b/src/App.svelte index 9efe1fb5..3f718658 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -1,6 +1,6 @@ + +
+
+
+

{language.persona}

+
+ +
+
+ {#each $DataBase.personas as persona, i} + + {/each} +
+
+ + \ No newline at end of file diff --git a/src/lib/SideBars/CharConfig.svelte b/src/lib/SideBars/CharConfig.svelte index 00441f7f..2da312a0 100644 --- a/src/lib/SideBars/CharConfig.svelte +++ b/src/lib/SideBars/CharConfig.svelte @@ -3,7 +3,7 @@ import { tokenizeAccurate } from "../../ts/tokenizer"; import { DataBase, saveImage as saveAsset, type Database, type character, type groupChat } from "../../ts/storage/database"; import { ShowRealmFrameStore, selectedCharID } from "../../ts/stores"; - import { PlusIcon, SmileIcon, TrashIcon, UserIcon, ActivityIcon, BookIcon, User, CurlyBraces, Volume2Icon } from 'lucide-svelte' + import { PlusIcon, SmileIcon, TrashIcon, UserIcon, ActivityIcon, BookIcon, User, CurlyBraces, Volume2Icon, DownloadIcon, FolderUpIcon } from 'lucide-svelte' import Check from "../UI/GUI/CheckInput.svelte"; import { addCharEmotion, addingEmotion, getCharImage, rmCharEmotion, selectCharImg, makeGroupImage, removeChar, changeCharImage } from "../../ts/characters"; import LoreBook from "./LoreBook/LoreBookSetting.svelte"; @@ -30,7 +30,10 @@ import { registerOnnxModel } from "src/ts/process/transformers"; import MultiLangInput from "../UI/GUI/MultiLangInput.svelte"; import { applyModule } from "src/ts/process/modules"; + import { exportRegex, importRegex } from "src/ts/process/scripts"; + import Arcodion from "../UI/Arcodion.svelte"; import SliderInput from "../UI/GUI/SliderInput.svelte"; + let subMenu = 0 @@ -592,18 +595,26 @@ {language.regexScript} - +
+ + + +
{language.triggerScript}
@@ -1012,71 +1023,72 @@
- {language.additionalAssets} -
- - - - - - {#if (!currentChar.data.additionalAssets) || currentChar.data.additionalAssets.length === 0} + +
+
{language.value} - -
-
No Assets
- - {:else} - {#each currentChar.data.additionalAssets as assets, i} - - - - + + for(const f of da){ + const img = f.data + const name = f.name + const extension = name.split('.').pop().toLowerCase() + const imgp = await saveAsset(img,'', extension) + currentChar.data.additionalAssets.push([name, imgp, extension]) + currentChar.data.additionalAssets = currentChar.data.additionalAssets + } + } + }}> + + + + + {#if (!currentChar.data.additionalAssets) || currentChar.data.additionalAssets.length === 0} + +
No Assets
- {/each} - {/if} -
- {#if assetFilePath[i] && database.useAdditionalAssetsPreview} - {#if assetFileExtensions[i] === 'mp4'} - - - {:else if assetFileExtensions[i] === 'mp3'} - - {:else} - {assets[0]}/ - {/if} - {/if} - - - {language.value} + -
-
+ {:else} + {#each currentChar.data.additionalAssets as assets, i} + + + {#if assetFilePath[i] && database.useAdditionalAssetsPreview} + {#if assetFileExtensions[i] === 'mp4'} + + + {:else if assetFileExtensions[i] === 'mp3'} + + {:else} + {assets[0]}/ + {/if} + {/if} + + + + + + + + {/each} + {/if} + + +
diff --git a/src/lib/SideBars/Sidebar.svelte b/src/lib/SideBars/Sidebar.svelte index 47322209..e3a73290 100644 --- a/src/lib/SideBars/Sidebar.svelte +++ b/src/lib/SideBars/Sidebar.svelte @@ -52,7 +52,6 @@ import SideChatList from "./SideChatList.svelte"; import { joinMultiuserRoom } from "src/ts/sync/multiuser"; import { sideBarSize } from "src/ts/gui/guisize"; - let openPresetList = false; let sideBarMode = 0; let editMode = false; let menuMode = 0; @@ -703,14 +702,6 @@ {/if}
-{#if openPresetList} - { - openPresetList = false; - }} - /> -{/if} - {#if $DynamicGUI}
{ if($sideBarClosing){ diff --git a/src/lib/UI/Arcodion.svelte b/src/lib/UI/Arcodion.svelte index 03d4418b..f2325716 100644 --- a/src/lib/UI/Arcodion.svelte +++ b/src/lib/UI/Arcodion.svelte @@ -18,7 +18,9 @@ on:click={() => { open = !open }} - >{name}{#if help} + > + {name} + {#if help} {/if} {#if open} diff --git a/src/lib/UI/GUI/ColorInput.svelte b/src/lib/UI/GUI/ColorInput.svelte index 238c0cfb..c8d9d8af 100644 --- a/src/lib/UI/GUI/ColorInput.svelte +++ b/src/lib/UI/GUI/ColorInput.svelte @@ -1,11 +1,13 @@
diff --git a/src/lib/UI/ModelList.svelte b/src/lib/UI/ModelList.svelte index 38f452f3..a519f447 100644 --- a/src/lib/UI/ModelList.svelte +++ b/src/lib/UI/ModelList.svelte @@ -104,6 +104,7 @@ + diff --git a/src/ts/gui/colorscheme.ts b/src/ts/gui/colorscheme.ts index 790147e9..32783836 100644 --- a/src/ts/gui/colorscheme.ts +++ b/src/ts/gui/colorscheme.ts @@ -230,8 +230,8 @@ export function updateTextTheme(){ root.style.setProperty('--FontColorItalic', db.customTextTheme.FontColorItalic); root.style.setProperty('--FontColorBold', db.customTextTheme.FontColorBold); root.style.setProperty('--FontColorItalicBold', db.customTextTheme.FontColorItalicBold); - root.style.setProperty('--FontColorQuote1', db.customTextTheme.FontColorQuote1); - root.style.setProperty('--FontColorQuote2', db.customTextTheme.FontColorQuote2); + root.style.setProperty('--FontColorQuote1', db.customTextTheme.FontColorQuote1 ?? '#8BE9FD'); + root.style.setProperty('--FontColorQuote2', db.customTextTheme.FontColorQuote2 ?? '#FFB86C'); break } } diff --git a/src/ts/hotkey.ts b/src/ts/hotkey.ts index c58b9086..a6681556 100644 --- a/src/ts/hotkey.ts +++ b/src/ts/hotkey.ts @@ -1,7 +1,7 @@ import { get } from "svelte/store" import { alertToast, doingAlert } from "./alert" import { DataBase, changeToPreset as changeToPreset2 } from "./storage/database" -import { selectedCharID, settingsOpen } from "./stores" +import { openPersonaList, openPresetList, selectedCharID, settingsOpen } from "./stores" export function initHotkey(){ document.addEventListener('keydown', (ev) => { @@ -73,6 +73,18 @@ export function initHotkey(){ ev.stopPropagation() break } + case 'p':{ + openPresetList.set(!get(openPresetList)) + ev.preventDefault() + ev.stopPropagation() + break + } + case 'e':{ + openPersonaList.set(!get(openPersonaList)) + ev.preventDefault() + ev.stopPropagation() + break + } } } if(ev.key === 'Escape'){ diff --git a/src/ts/model/names.ts b/src/ts/model/names.ts index ffc08d98..701e232a 100644 --- a/src/ts/model/names.ts +++ b/src/ts/model/names.ts @@ -109,6 +109,8 @@ export function getModelName(name:string){ return 'GPT-4o Mini (2024-07-18)' case 'gemini-1.5-pro-latest': return 'Gemini 1.5 Pro' + case 'gemini-1.5-pro-exp-0801': + return 'Gemini 1.5 Pro Exp (0801)' case 'gemini-1.5-flash': return 'Gemini 1.5 Flash' case 'ollama-hosted': diff --git a/src/ts/parser.ts b/src/ts/parser.ts index 3d4ff799..86907784 100644 --- a/src/ts/parser.ts +++ b/src/ts/parser.ts @@ -79,11 +79,19 @@ DOMPurify.addHook("uponSanitizeAttribute", (node, data) => { function renderMarkdown(md:markdownit, data:string){ - return md.render(data.replace(/“|”/g, '"').replace(/‘|’/g, "'")) - .replace(/\uE9b0/gu, '“') - .replace(/\uE9b1/gu, '”') - .replace(/\uE9b2/gu, '‘') - .replace(/\uE9b3/gu, '’') + const db = get(DataBase) + let text = md.render(data.replace(/“|”/g, '"').replace(/‘|’/g, "'")) + + if(db?.unformatQuotes){ + text = text.replace(/\uE9b0/gu, '“').replace(/\uE9b1/gu, '”') + text = text.replace(/\uE9b2/gu, '‘').replace(/\uE9b3/gu, '’') + } + else{ + text = text.replace(/\uE9b0/gu, '“').replace(/\uE9b1/gu, '”') + text = text.replace(/\uE9b2/gu, '‘').replace(/\uE9b3/gu, '’') + } + + return text } async function renderHighlightableMarkdown(data:string) { diff --git a/src/ts/process/request.ts b/src/ts/process/request.ts index e139b6fe..24cc1d2c 100644 --- a/src/ts/process/request.ts +++ b/src/ts/process/request.ts @@ -1153,6 +1153,7 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model' case 'gemini-pro': case 'gemini-pro-vision': case 'gemini-1.5-pro-latest': + case 'gemini-1.5-pro-exp-0801': case 'gemini-1.5-flash': case 'gemini-ultra': case 'gemini-ultra-vision':{ @@ -1997,6 +1998,10 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model' headers['anthropic-beta'] = 'prompt-caching-2024-07-31' } + if(db.usePlainFetch){ + headers['anthropic-dangerous-direct-browser-access'] = 'true' + } + if(useStreaming){ const res = await fetchNative(replacerURL, { diff --git a/src/ts/process/scripts.ts b/src/ts/process/scripts.ts index 488329a9..e3fe865b 100644 --- a/src/ts/process/scripts.ts +++ b/src/ts/process/scripts.ts @@ -20,9 +20,9 @@ export async function processScript(char:character|groupChat, data:string, mode: return (await processScriptFull(char, data, mode)).data } -export function exportRegex(){ +export function exportRegex(s?:customscript[]){ let db = get(DataBase) - const script = db.globalscript + const script = s ?? db.globalscript const data = Buffer.from(JSON.stringify({ type: 'regex', data: script @@ -31,22 +31,22 @@ export function exportRegex(){ alertNormal(language.successExport) } -export async function importRegex(){ +export async function importRegex(o?:customscript[]):Promise{ + o = o ?? [] const filedata = (await selectSingleFile(['json'])).data if(!filedata){ - return + return o } let db = get(DataBase) try { const imported= JSON.parse(Buffer.from(filedata).toString('utf-8')) if(imported.type === 'regex' && imported.data){ const datas:customscript[] = imported.data - const script = db.globalscript + const script = o for(const data of datas){ script.push(data) } - db.globalscript = script - setDatabase(db) + return o } else{ alertError("File invaid or corrupted") @@ -55,6 +55,7 @@ export async function importRegex(){ } catch (error) { alertError(`${error}`) } + return o } let bestMatchCache = new Map() diff --git a/src/ts/process/templates/chatTemplate.ts b/src/ts/process/templates/chatTemplate.ts index 71b969b2..a12886bd 100644 --- a/src/ts/process/templates/chatTemplate.ts +++ b/src/ts/process/templates/chatTemplate.ts @@ -11,7 +11,7 @@ export const chatTemplates = { 'chatml': `{% for message in messages %}{{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant\n' }}{% endif %}`, 'gpt2': `{% for message in messages %}{{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant\n' }}{% endif %}`, 'gemma': "{% if messages[0]['role'] == 'system' %}{{ raise_exception('System role not supported') }}{% endif %}{% for message in messages %}{% if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}{% endif %}{% if (message['role'] == 'assistant') %}{% set role = 'model' %}{% else %}{% set role = message['role'] %}{% endif %}{{ '' + role + '\n' + message['content'] | trim + '\n' }}{% endfor %}{% if add_generation_prompt %}{{'model\n'}}{% endif %}", - 'mistral': "{% for message in messages %}{% if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}{% endif %}{% if message['role'] == 'user' %}{{ ' [INST] ' + message['content'] + ' [/INST]' }}{% elif message['role'] == 'assistant' %}{{ ' ' + message['content'] + ' ' + eos_token}}{% else %}{{ raise_exception('Only user and assistant roles are supported!') }}{% endif %}{% endfor %}", + 'mistral': "{% for message in messages %}{% if message['role'] == 'user' %}{{ ' [INST] ' + message['content'] + ' [/INST]' }}{% elif message['role'] == 'assistant' %}{{ ' ' + message['content'] + ' ' + eos_token}}{% else %}{{ raise_exception('Only user and assistant roles are supported!') }}{% endif %}{% endfor %}", 'vicuna': "{%- set ns = namespace(found=false) -%}\n{%- for message in messages -%}\n {%- if message['role'] == 'system' -%}\n {%- set ns.found = true -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if not ns.found -%}\n {{- '' + 'A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user\\'s questions.' + '\\n\\n' -}}\n{%- endif %}\n{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {{- '' + message['content'] + '\\n\\n' -}}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{-'USER: ' + message['content'] + '\\n'-}}\n {%- else -%}\n {{-'ASSISTANT: ' + message['content'] + '\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{-'ASSISTANT:'-}}\n{%- endif -%}", "alpaca": "{%- set ns = namespace(found=false) -%}\n{%- for message in messages -%}\n {%- if message['role'] == 'system' -%}\n {%- set ns.found = true -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if not ns.found -%}\n {{- '' + 'Below is an instruction that describes a task. Write a response that appropriately completes the request.' + '\\n\\n' -}}\n{%- endif %}\n{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {{- '' + message['content'] + '\\n\\n' -}}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{-'### Instruction:\\n' + message['content'] + '\\n\\n'-}}\n {%- else -%}\n {{-'### Response:\\n' + message['content'] + '\\n\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{-'### Response:\\n'-}}\n{%- endif -%}" } @@ -22,7 +22,7 @@ export const templateEffect = { ], 'mistral': [ 'no_system_messages', - 'alter_user_assistant_roles' + 'alter_user_assistant_roles', ], } as {[key:string]:TemplateEffect[]} @@ -94,6 +94,8 @@ export const applyChatTemplate = (messages:OpenAIChat[]) => { "messages": formatedMessages, "add_generation_prompt": true, "risu_char": currentChar.name, - "risu_user": getUserName() + "risu_user": getUserName(), + "eos_token": "", + "bos_token": "", }) } \ No newline at end of file diff --git a/src/ts/storage/autoStorage.ts b/src/ts/storage/autoStorage.ts index 1157b171..2c599b4d 100644 --- a/src/ts/storage/autoStorage.ts +++ b/src/ts/storage/autoStorage.ts @@ -2,7 +2,7 @@ import localforage from "localforage" import { isNodeServer, replaceDbResources } from "./globalApi" import { NodeStorage } from "./nodeStorage" import { OpfsStorage } from "./opfsStorage" -import { alertSelect, alertStore } from "../alert" +import { alertInput, alertSelect, alertStore } from "../alert" import { get } from "svelte/store" import { DataBase, type Database } from "./database" import { AccountStorage } from "./accountStorage" @@ -67,6 +67,13 @@ export class AutoStorage{ return true } } + + const confirm = await alertInput(`to overwrite your data, type "RISUAI"`) + if(confirm !== "RISUAI"){ + localStorage.setItem('dosync', 'avoid') + return false + } + let replaced:{[key:string]:string} = {} for(const key of keys){ diff --git a/src/ts/storage/database.ts b/src/ts/storage/database.ts index 1f5f8b26..20886dd0 100644 --- a/src/ts/storage/database.ts +++ b/src/ts/storage/database.ts @@ -428,6 +428,8 @@ export function setDatabase(data:Database){ negInputName: 'text', timeout: 30 } + data.hideApiKey ??= true + data.unformatQuotes ??= false changeLanguage(data.language) DataBase.set(data) @@ -710,6 +712,8 @@ export interface Database{ comfyUiUrl: string useLegacyGUI: boolean claudeCachingExperimental: boolean + hideApiKey: boolean + unformatQuotes: boolean } export interface customscript{ diff --git a/src/ts/stores.ts b/src/ts/stores.ts index 2b3a6f2d..0bfeb59a 100644 --- a/src/ts/stores.ts +++ b/src/ts/stores.ts @@ -26,7 +26,8 @@ export const ViewBoxsize = writable({ width: 12 * 16, height: 12 * 16 }); // Def export const settingsOpen = writable(false) export const botMakerMode = writable(false) export const moduleBackgroundEmbedding = writable('') - +export const openPresetList = writable(false) +export const openPersonaList = writable(false) //optimization export const CurrentCharacter = writable(null) as Writable