From 26e0fb641382b6345405dff7138f31c5c7787662 Mon Sep 17 00:00:00 2001 From: kwaroran Date: Wed, 24 May 2023 04:16:34 +0900 Subject: [PATCH] [feat] novelai support --- src/lib/Setting/Pages/BotSettings.svelte | 52 +++++++++++++++++------- src/lib/Setting/Settings.svelte | 4 +- src/ts/database.ts | 24 +++++++++++ src/ts/process/request.ts | 48 +++++++++++++++++++++- 4 files changed, 110 insertions(+), 18 deletions(-) diff --git a/src/lib/Setting/Pages/BotSettings.svelte b/src/lib/Setting/Pages/BotSettings.svelte index 7b5897d6..313b56b7 100644 --- a/src/lib/Setting/Pages/BotSettings.svelte +++ b/src/lib/Setting/Pages/BotSettings.svelte @@ -37,24 +37,38 @@

{language.chatBot}

{language.model} {language.submodel} - + + + + + + + {#if $DataBase.aiModel === 'novelai' || isTauri} + + {/if} + + {#if $DataBase.plugins.length > 0} + + {/if} + {#if $DataBase.aiModel === 'palm2' || $DataBase.subModel === 'palm2'} @@ -78,6 +92,11 @@ {/each} {/if} +{#if $DataBase.aiModel === "novelai" || $DataBase.subModel === "novelai"} + NovelAI Bearer Token + + +{/if} {#if $DataBase.aiModel === 'textgen_webui' || $DataBase.subModel === 'textgen_webui'} TextGen {language.providerURL} @@ -98,12 +117,15 @@ {tokens.globalNote} {language.tokens} {language.maxContextSize} + {#if $DataBase.aiModel === 'gpt35'} {:else if $DataBase.aiModel === 'gpt4' || $DataBase.aiModel === 'textgen_webui'} {:else if $DataBase.aiModel === 'custom'} +{:else} + {/if} {language.maxResponseSize} diff --git a/src/lib/Setting/Settings.svelte b/src/lib/Setting/Settings.svelte index 173b1787..bfbac3cb 100644 --- a/src/lib/Setting/Settings.svelte +++ b/src/lib/Setting/Settings.svelte @@ -10,8 +10,8 @@ import AdvancedSettings from "./Pages/AdvancedSettings.svelte"; import { SizeStore, settingsOpen } from "src/ts/stores"; import Botpreset from "./botpreset.svelte"; - import Communities from "./Pages/Communities.svelte"; - import { openURL } from "src/ts/globalApi"; + import Communities from "./Pages/Communities.svelte"; + import { openURL } from "src/ts/globalApi"; let selected = -1 let openPresetList = false if(window.innerWidth >= 700){ diff --git a/src/ts/database.ts b/src/ts/database.ts index 9bd3051e..ba23de50 100644 --- a/src/ts/database.ts +++ b/src/ts/database.ts @@ -222,6 +222,19 @@ export function setDatabase(data:Database){ FontColorItalicBold: "#8C8D93" } } + if(checkNullish(data.hordeConfig)){ + data.hordeConfig = { + apiKey: "", + model: "", + softPrompt: "" + } + } + if(checkNullish(data.novelai)){ + data.novelai = { + token: "", + model: "clio-v1", + } + } changeLanguage(data.language) @@ -431,6 +444,17 @@ export interface Database{ textScreenRounded?:boolean textScreenBorder?:string characterOrder:(string|folder)[] + hordeConfig:hordeConfig, + novelai:{ + token:string, + model:string + } +} + +interface hordeConfig{ + apiKey:string + model:string + softPrompt:string } export interface folder{ diff --git a/src/ts/process/request.ts b/src/ts/process/request.ts index 124aa07f..e61cb9d2 100644 --- a/src/ts/process/request.ts +++ b/src/ts/process/request.ts @@ -4,7 +4,7 @@ import { DataBase, setDatabase, type character } from "../database"; import { pluginProcess } from "./plugins"; import { language } from "../../lang"; import { stringlizeChat } from "./stringlize"; -import { globalFetch } from "../globalApi"; +import { globalFetch, isTauri } from "../globalApi"; interface requestDataArgument{ formated: OpenAIChat[] @@ -173,6 +173,52 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model' break } + case 'novelai':{ + if(!isTauri){ + return{ + type: 'fail', + result: "NovelAI doesn't work in web version." + } + } + const proompt = stringlizeChat(formated, currentChar?.name ?? '') + const params = { + "input": proompt, + "model":db.novelai.model, + "parameters":{ + "use_string":true, + "temperature":1.7, + "max_length":90, + "min_length":1, + "tail_free_sampling":0.6602, + "repetition_penalty":1.0565, + "repetition_penalty_range":340, + "repetition_penalty_frequency":0, + "repetition_penalty_presence":0, + "use_cache":false, + "return_full_text":false, + "prefix":"vanilla", + "order":[3,0]} + } + + const da = await globalFetch("https://api.novelai.net/ai/generate", { + body: params, + headers: { + "Authorization": "Bearer " + db.novelai.token + } + }) + + if((!da.ok )|| (!da.data.output)){ + return { + type: 'fail', + result: (language.errors.httpError + `${JSON.stringify(da.data)}`) + } + } + return { + type: "success", + result: da.data.output + } + } + case "textgen_webui":{ let DURL = db.textgenWebUIURL let bodyTemplate:any