diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index d6cd4f5e..1e3d4cf7 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -8,7 +8,7 @@ }, "package": { "productName": "RisuAI", - "version": "0.9.6" + "version": "1.10.0" }, "tauri": { "allowlist": { diff --git a/src/lang/en.ts b/src/lang/en.ts index c2498f8d..34378231 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -245,5 +245,8 @@ export const languageEnglish = { Speech: "Speech", ToggleSuperMemory: "Toggle SupaMemory", SuperMemory:"SupaMemory", - useExperimental: "Able Experimental Features" + useExperimental: "Able Experimental Features", + showMemoryLimit: "Show Memory Limit", + roundIcons: "Round Icons", + useStreaming: "Use Streaming" } diff --git a/src/lib/ChatScreens/Chat.svelte b/src/lib/ChatScreens/Chat.svelte index 96ecfd44..0054c483 100644 --- a/src/lib/ChatScreens/Chat.svelte +++ b/src/lib/ChatScreens/Chat.svelte @@ -10,6 +10,7 @@ import { replacePlaceholders } from "../../ts/util"; export let message = '' export let name = '' + export let isLastMemory:boolean export let img:string|Promise = '' export let idx = -1 export let rerollIcon = false @@ -61,12 +62,14 @@ $: displaya(message) -
-
+
+
{#await img} -
+
{:then m} -
+
{/await}
@@ -142,7 +145,7 @@ justify-content: flex-start; } .chat{ - max-width: calc(95% - 0.5rem); + max-width: calc(100% - 0.5rem); word-break: normal; overflow-wrap: anywhere; } diff --git a/src/lib/ChatScreens/DefaultChatScreen.svelte b/src/lib/ChatScreens/DefaultChatScreen.svelte index 937cf5b0..410c8908 100644 --- a/src/lib/ChatScreens/DefaultChatScreen.svelte +++ b/src/lib/ChatScreens/DefaultChatScreen.svelte @@ -246,6 +246,7 @@ rerollIcon={i === 0} onReroll={reroll} unReroll={unReroll} + isLastMemory={$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].lastMemory === (chat.chatId ?? 'none') && $DataBase.showMemoryLimit} /> {:else} {/if} {:else} @@ -264,6 +266,7 @@ name={$DataBase.username} message={chat.data} img={getCharImage($DataBase.userIcon, 'css')} + isLastMemory={$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].lastMemory === (chat.chatId ?? 'none') && $DataBase.showMemoryLimit} /> {/if} {/each} @@ -300,6 +303,8 @@ } $DataBase.characters[$selectedCharID] = cha }} + isLastMemory={false} + /> {#if !$DataBase.characters[$selectedCharID].removedQuotes && $DataBase.characters[$selectedCharID].creatorNotes.length >= 2} { diff --git a/src/lib/SideBars/Settings.svelte b/src/lib/SideBars/Settings.svelte index ca7e7c22..31478f47 100644 --- a/src/lib/SideBars/Settings.svelte +++ b/src/lib/SideBars/Settings.svelte @@ -98,6 +98,7 @@ + {#if $DataBase.plugins.length > 0} {/if} @@ -107,12 +108,17 @@ + {#if $DataBase.aiModel === 'palm2' || $DataBase.subModel === 'palm2'} + Palm2 {language.apiKey} + + {/if} {#if $DataBase.aiModel === 'gpt35' || $DataBase.aiModel === 'gpt4' || $DataBase.subModel === 'gpt4' || $DataBase.subModel === 'gpt35'} OpenAI {language.apiKey} @@ -363,6 +369,11 @@ {language.fullscreen}
+
+ + {language.showMemoryLimit} +
+
{ if(check){ @@ -392,6 +403,11 @@ {language.SwipeRegenerate}
+
+ + {language.roundIcons} +
+
{language.instantRemove} @@ -401,7 +417,7 @@

{language.plugin}

{language.pluginWarn} - +
{#if $DataBase.plugins.length === 0} No Plugins diff --git a/src/lib/SideBars/SidebarAvatar.svelte b/src/lib/SideBars/SidebarAvatar.svelte index 8d133654..c7250796 100644 --- a/src/lib/SideBars/SidebarAvatar.svelte +++ b/src/lib/SideBars/SidebarAvatar.svelte @@ -1,4 +1,6 @@ @@ -11,6 +13,7 @@ style:width={size + "px"} style:height={size + "px"} style:minWidth={size + "px"} + class:rounded-md={!$DataBase.roundIcons} class:rounded-full={$DataBase.roundIcons} /> {:then img} avatar {/await} @@ -28,6 +32,7 @@ style:width={size + "px"} style:height={size + "px"} style:minWidth={size + "px"} + class:rounded-md={!$DataBase.roundIcons} class:rounded-full={$DataBase.roundIcons} /> {/if} diff --git a/src/styles.css b/src/styles.css index 712fac23..3398f55e 100644 --- a/src/styles.css +++ b/src/styles.css @@ -107,4 +107,8 @@ html, body{ border: none; outline: 0; border-bottom: 1px solid #6272a4; +} + +.bgc{ + border-top: 1px solid rgba(98, 114, 164, 0.3); } \ No newline at end of file diff --git a/src/ts/database.ts b/src/ts/database.ts index 0eb32603..52ae8300 100644 --- a/src/ts/database.ts +++ b/src/ts/database.ts @@ -7,7 +7,7 @@ import { cloneDeep } from 'lodash'; export const DataBase = writable({} as any as Database) export const loadedStore = writable(false) -export let appVer = '0.9.6' +export let appVer = '1.10.0' export function setDatabase(data:Database){ @@ -80,6 +80,9 @@ export function setDatabase(data:Database){ if(checkNullish(data.language)){ data.language = 'en' } + if(checkNullish(data.swipe)){ + data.swipe = true + } if(checkNullish(data.translator)){ data.translator = '' } @@ -187,6 +190,9 @@ export function setDatabase(data:Database){ if(checkNullish(data.supaMemoryPrompt)){ data.supaMemoryPrompt = '' } + if(checkNullish(data.showMemoryLimit)){ + data.showMemoryLimit = false + } if(checkNullish(data.sdConfig)){ data.sdConfig = { width:512, @@ -399,6 +405,10 @@ export interface Database{ showUnrecommended:boolean elevenLabKey:string useExperimental:boolean + showMemoryLimit:boolean + roundIcons:boolean + useStreaming:boolean + palmAPI:string } @@ -422,6 +432,7 @@ export interface Chat{ localLore: loreBook[] sdData?:string supaMemoryData?:string + lastMemory?:string } export interface Message{ diff --git a/src/ts/process/index.ts b/src/ts/process/index.ts index 4c04303b..9c7f778c 100644 --- a/src/ts/process/index.ts +++ b/src/ts/process/index.ts @@ -238,18 +238,21 @@ export async function sendChat(chatProcessIndex = -1):Promise { chats = sp.chats currentTokens = sp.currentTokens currentChat.supaMemoryData = sp.memory ?? currentChat.supaMemoryData + currentChat.lastMemory = sp.lastId ?? currentChat.lastMemory } else{ while(currentTokens > maxContextTokens){ if(chats.length <= 1){ alertError(language.errors.toomuchtoken) - + return false } - + currentTokens -= (await tokenize(chats[0].content) + 1) chats.splice(0, 1) - } + } + currentChat.lastMemory = chats[0].memo + console.log(currentChat.lastMemory) } let bias:{[key:number]:number} = {} @@ -334,6 +337,9 @@ export async function sendChat(chatProcessIndex = -1):Promise { if(req.type === 'fail'){ alertError(req.result) return false + } + else if(req.type === 'streaming'){ + } else{ const result2 = processScriptFull(currentChar, reformatContent(req.result), 'editoutput') @@ -426,8 +432,8 @@ export async function sendChat(chatProcessIndex = -1):Promise { maxTokens: 30, }, 'submodel') - if(rq.type === 'fail'){ - alertError(rq.result) + if(rq.type === 'fail' || rq.type === 'streaming'){ + alertError(`${rq.result}`) return true } else{ diff --git a/src/ts/process/request.ts b/src/ts/process/request.ts index 31e17e84..20e47578 100644 --- a/src/ts/process/request.ts +++ b/src/ts/process/request.ts @@ -19,6 +19,9 @@ interface requestDataArgument{ type requestDataResponse = { type: 'success'|'fail' result: string +}|{ + type: "streaming", + result: ReadableStreamDefaultReader } export async function requestChatData(arg:requestDataArgument, model:'model'|'submodel'):Promise { @@ -68,6 +71,22 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model' replacerURL += 'chat/completions' } + if(db.useStreaming){ + const da = await fetch(replacerURL, { + body: JSON.stringify(body), + headers: { + "Authorization": "Bearer " + db.openAIKey + }, + }) + + const reader = da.body.getReader() + + return { + type: 'streaming', + result: reader + } + } + const res = await globalFetch(replacerURL, { body: body, headers: { @@ -233,6 +252,78 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model' } break } + case 'palm2':{ + const body = { + "prompt": { + "text": stringlizeChat(formated, currentChar?.name ?? '') + }, + "safetySettings":[ + { + "category": "HARM_CATEGORY_UNSPECIFIED", + "threshold": "BLOCK_NONE" + }, + { + "category": "HARM_CATEGORY_DEROGATORY", + "threshold": "BLOCK_NONE" + }, + { + "category": "HARM_CATEGORY_TOXICITY", + "threshold": "BLOCK_NONE" + }, + { + "category": "HARM_CATEGORY_VIOLENCE", + "threshold": "BLOCK_NONE" + }, + { + "category": "HARM_CATEGORY_SEXUAL", + "threshold": "BLOCK_NONE" + }, + { + "category": "HARM_CATEGORY_MEDICAL", + "threshold": "BLOCK_NONE" + }, + { + "category": "HARM_CATEGORY_DANGEROUS", + "threshold": "BLOCK_NONE" + } + ], + "temperature": arg.temperature, + "maxOutputTokens": arg.maxTokens, + "candidate_count": 1 + } + const res = await globalFetch(`https://generativelanguage.googleapis.com/v1beta2/models/text-bison-001:generateText?key=${db.palmAPI}`, { + body: body, + headers: { + "Content-Type": "application/json" + }, + }) + + if(res.ok){ + if(res.data.candidates){ + let output:string = res.data.candidates[0].output + const ind = output.search(/(system note)|(user)|(assistant):/gi) + if(ind >= 0){ + output = output.substring(0, ind) + } + return { + type: 'success', + result: output + } + } + else{ + return { + type: 'fail', + result: `${JSON.stringify(res.data)}` + } + } + } + else{ + return { + type: 'fail', + result: `${JSON.stringify(res.data)}` + } + } + } default:{ return { type: 'fail', diff --git a/src/ts/process/stableDiff.ts b/src/ts/process/stableDiff.ts index 978bb479..58b33a91 100644 --- a/src/ts/process/stableDiff.ts +++ b/src/ts/process/stableDiff.ts @@ -80,8 +80,8 @@ export async function stableDiff(currentChar:character,prompt:string){ }, 'submodel') - if(rq.type === 'fail'){ - alertError(rq.result) + if(rq.type === 'fail' || rq.type === 'streaming'){ + alertError(`${rq.result}`) return false } else{ diff --git a/src/ts/process/supaMemory.ts b/src/ts/process/supaMemory.ts index cf48284a..b2fa6d77 100644 --- a/src/ts/process/supaMemory.ts +++ b/src/ts/process/supaMemory.ts @@ -5,8 +5,10 @@ import { tokenize } from "../tokenizer"; import { findCharacterbyId } from "../util"; import { requestChatData } from "./request"; -export async function supaMemory(chats:OpenAIChat[],currentTokens:number,maxContextTokens:number,room:Chat,char:character|groupChat): Promise<{ currentTokens: number; chats: OpenAIChat[]; error?:string; memory?:string}>{ +export async function supaMemory(chats:OpenAIChat[],currentTokens:number,maxContextTokens:number,room:Chat,char:character|groupChat): Promise<{ currentTokens: number; chats: OpenAIChat[]; error?:string; memory?:string;lastId?:string}>{ const db = get(DataBase) + console.log("Memory: " + currentTokens) + if(currentTokens > maxContextTokens){ let coIndex = -1 for(let i=0;i