[feat] novelai support
This commit is contained in:
@@ -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}>
|
||||||
|
|||||||
@@ -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){
|
||||||
|
|||||||
@@ -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{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user