[feat] novelai support

This commit is contained in:
kwaroran
2023-05-24 04:16:34 +09:00
parent 3f4baac593
commit 26e0fb6413
4 changed files with 110 additions and 18 deletions

View File

@@ -37,24 +37,38 @@
<h2 class="mb-2 text-2xl font-bold mt-2">{language.chatBot}</h2> <h2 class="mb-2 text-2xl font-bold mt-2">{language.chatBot}</h2>
<span class="text-neutral-200 mt-4">{language.model} <Help key="model"/></span> <span class="text-neutral-200 mt-4">{language.model} <Help key="model"/></span>
<select class="bg-transparent input-text mt-2 mb-2 text-gray-200 appearance-none text-sm" bind:value={$DataBase.aiModel}> <select class="bg-transparent input-text mt-2 mb-2 text-gray-200 appearance-none text-sm" bind:value={$DataBase.aiModel}>
<option value="gpt35" class="bg-darkbg appearance-none">OpenAI GPT-3.5</option> <optgroup class="bg-darkbg appearance-none" label="OpenAI">
<option value="gpt4" class="bg-darkbg appearance-none">OpenAI GPT-4</option> <option value="gpt35" class="bg-darkbg appearance-none">OpenAI GPT-3.5</option>
<option value="textgen_webui" class="bg-darkbg appearance-none">Text Generation WebUI</option> <option value="gpt4" class="bg-darkbg appearance-none">OpenAI GPT-4</option>
<option value="palm2" class="bg-darkbg appearance-none">Google Palm2</option> </optgroup>
{#if $DataBase.plugins.length > 0} <optgroup class="bg-darkbg appearance-none" label="Other Providers">
<option value="custom" class="bg-darkbg appearance-none">Plugin</option> <option value="palm2" class="bg-darkbg appearance-none">Google Palm2</option>
{/if} {#if $DataBase.aiModel === 'novelai' || isTauri}
<option value="novelai" class="bg-darkbg appearance-none">NovelAI</option>
{/if}
<option value="textgen_webui" class="bg-darkbg appearance-none">Text Generation WebUI</option>
{#if $DataBase.plugins.length > 0}
<option value="custom" class="bg-darkbg appearance-none">Plugin</option>
{/if}
</optgroup>
</select> </select>
<span class="text-neutral-200 mt-2">{language.submodel} <Help key="submodel"/></span> <span class="text-neutral-200 mt-2">{language.submodel} <Help key="submodel"/></span>
<select class="bg-transparent input-text mt-2 mb-4 text-gray-200 appearance-none text-sm" bind:value={$DataBase.subModel}> <select class="bg-transparent input-text mt-2 mb-2 text-gray-200 appearance-none text-sm" bind:value={$DataBase.subModel}>
<option value="gpt35" class="bg-darkbg appearance-none">OpenAI GPT-3.5</option> <optgroup class="bg-darkbg appearance-none" label="OpenAI">
<option value="gpt4" class="bg-darkbg appearance-none">OpenAI GPT-4</option> <option value="gpt35" class="bg-darkbg appearance-none">OpenAI GPT-3.5</option>
<option value="palm2" class="bg-darkbg appearance-none">Google Palm2</option> <option value="gpt4" class="bg-darkbg appearance-none">OpenAI GPT-4</option>
<option value="textgen_webui" class="bg-darkbg appearance-none">Text Generation WebUI</option> </optgroup>
{#if $customProviderStore.length > 0} <optgroup class="bg-darkbg appearance-none" label="Other Providers">
<option value="custom" class="bg-darkbg appearance-none">Plugin</option> <option value="palm2" class="bg-darkbg appearance-none">Google Palm2</option>
{/if} {#if $DataBase.aiModel === 'novelai' || isTauri}
<option value="novelai" class="bg-darkbg appearance-none">NovelAI Clio</option>
{/if}
<option value="textgen_webui" class="bg-darkbg appearance-none">Text Generation WebUI</option>
{#if $DataBase.plugins.length > 0}
<option value="custom" class="bg-darkbg appearance-none">Plugin</option>
{/if}
</optgroup>
</select> </select>
{#if $DataBase.aiModel === 'palm2' || $DataBase.subModel === 'palm2'} {#if $DataBase.aiModel === 'palm2' || $DataBase.subModel === 'palm2'}
@@ -78,6 +92,11 @@
{/each} {/each}
</select> </select>
{/if} {/if}
{#if $DataBase.aiModel === "novelai" || $DataBase.subModel === "novelai"}
<span class="text-neutral-200">NovelAI Bearer Token</span>
<input class="text-neutral-200 p-2 bg-transparent input-text focus:bg-selected text-sm mb-2" bind:value={$DataBase.novelai.token}>
{/if}
{#if $DataBase.aiModel === 'textgen_webui' || $DataBase.subModel === 'textgen_webui'} {#if $DataBase.aiModel === 'textgen_webui' || $DataBase.subModel === 'textgen_webui'}
<span class="text-neutral-200">TextGen {language.providerURL} <Help key="oogaboogaURL"/></span> <span class="text-neutral-200">TextGen {language.providerURL} <Help key="oogaboogaURL"/></span>
<input class="text-neutral-200 mb-4 p-2 bg-transparent input-text focus:bg-selected" placeholder="https://..." bind:value={$DataBase.textgenWebUIURL}> <input class="text-neutral-200 mb-4 p-2 bg-transparent input-text focus:bg-selected" placeholder="https://..." bind:value={$DataBase.textgenWebUIURL}>
@@ -98,12 +117,15 @@
<span class="text-gray-400 mb-6 text-sm">{tokens.globalNote} {language.tokens}</span> <span class="text-gray-400 mb-6 text-sm">{tokens.globalNote} {language.tokens}</span>
<span class="text-neutral-200">{language.maxContextSize}</span> <span class="text-neutral-200">{language.maxContextSize}</span>
{#if $DataBase.aiModel === 'gpt35'} {#if $DataBase.aiModel === 'gpt35'}
<input class="text-neutral-200 mb-4 text-sm p-2 bg-transparent input-text focus:bg-selected" type="number" min={0} max="4000" bind:value={$DataBase.maxContext}> <input class="text-neutral-200 mb-4 text-sm p-2 bg-transparent input-text focus:bg-selected" type="number" min={0} max="4000" bind:value={$DataBase.maxContext}>
{:else if $DataBase.aiModel === 'gpt4' || $DataBase.aiModel === 'textgen_webui'} {:else if $DataBase.aiModel === 'gpt4' || $DataBase.aiModel === 'textgen_webui'}
<input class="text-neutral-200 mb-4 text-sm p-2 bg-transparent input-text focus:bg-selected" type="number" min={0} max="8000" bind:value={$DataBase.maxContext}> <input class="text-neutral-200 mb-4 text-sm p-2 bg-transparent input-text focus:bg-selected" type="number" min={0} max="8000" bind:value={$DataBase.maxContext}>
{:else if $DataBase.aiModel === 'custom'} {:else if $DataBase.aiModel === 'custom'}
<input class="text-neutral-200 mb-4 text-sm p-2 bg-transparent input-text focus:bg-selected" type="number" min={0} max={getCurrentPluginMax($DataBase.currentPluginProvider)} bind:value={$DataBase.maxContext}> <input class="text-neutral-200 mb-4 text-sm p-2 bg-transparent input-text focus:bg-selected" type="number" min={0} max={getCurrentPluginMax($DataBase.currentPluginProvider)} bind:value={$DataBase.maxContext}>
{:else}
<input class="text-neutral-200 mb-4 text-sm p-2 bg-transparent input-text focus:bg-selected" type="number" min={0} bind:value={$DataBase.maxContext}>
{/if} {/if}
<span class="text-neutral-200">{language.maxResponseSize}</span> <span class="text-neutral-200">{language.maxResponseSize}</span>
<input class="text-neutral-200 mb-4 p-2 bg-transparent input-text focus:bg-selected text-sm" type="number" min={0} max="2048" bind:value={$DataBase.maxResponse}> <input class="text-neutral-200 mb-4 p-2 bg-transparent input-text focus:bg-selected text-sm" type="number" min={0} max="2048" bind:value={$DataBase.maxResponse}>

View File

@@ -10,8 +10,8 @@
import AdvancedSettings from "./Pages/AdvancedSettings.svelte"; import AdvancedSettings from "./Pages/AdvancedSettings.svelte";
import { SizeStore, settingsOpen } from "src/ts/stores"; import { SizeStore, settingsOpen } from "src/ts/stores";
import Botpreset from "./botpreset.svelte"; import Botpreset from "./botpreset.svelte";
import Communities from "./Pages/Communities.svelte"; import Communities from "./Pages/Communities.svelte";
import { openURL } from "src/ts/globalApi"; import { openURL } from "src/ts/globalApi";
let selected = -1 let selected = -1
let openPresetList = false let openPresetList = false
if(window.innerWidth >= 700){ if(window.innerWidth >= 700){

View File

@@ -222,6 +222,19 @@ export function setDatabase(data:Database){
FontColorItalicBold: "#8C8D93" FontColorItalicBold: "#8C8D93"
} }
} }
if(checkNullish(data.hordeConfig)){
data.hordeConfig = {
apiKey: "",
model: "",
softPrompt: ""
}
}
if(checkNullish(data.novelai)){
data.novelai = {
token: "",
model: "clio-v1",
}
}
changeLanguage(data.language) changeLanguage(data.language)
@@ -431,6 +444,17 @@ export interface Database{
textScreenRounded?:boolean textScreenRounded?:boolean
textScreenBorder?:string textScreenBorder?:string
characterOrder:(string|folder)[] characterOrder:(string|folder)[]
hordeConfig:hordeConfig,
novelai:{
token:string,
model:string
}
}
interface hordeConfig{
apiKey:string
model:string
softPrompt:string
} }
export interface folder{ export interface folder{

View File

@@ -4,7 +4,7 @@ import { DataBase, setDatabase, type character } from "../database";
import { pluginProcess } from "./plugins"; import { pluginProcess } from "./plugins";
import { language } from "../../lang"; import { language } from "../../lang";
import { stringlizeChat } from "./stringlize"; import { stringlizeChat } from "./stringlize";
import { globalFetch } from "../globalApi"; import { globalFetch, isTauri } from "../globalApi";
interface requestDataArgument{ interface requestDataArgument{
formated: OpenAIChat[] formated: OpenAIChat[]
@@ -173,6 +173,52 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
break 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":{ case "textgen_webui":{
let DURL = db.textgenWebUIURL let DURL = db.textgenWebUIURL
let bodyTemplate:any let bodyTemplate:any