[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>
|
||||
<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}>
|
||||
<optgroup class="bg-darkbg appearance-none" label="OpenAI">
|
||||
<option value="gpt35" class="bg-darkbg appearance-none">OpenAI GPT-3.5</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>
|
||||
<optgroup class="bg-darkbg appearance-none" label="Other Providers">
|
||||
<option value="palm2" class="bg-darkbg appearance-none">Google Palm2</option>
|
||||
{#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>
|
||||
|
||||
<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}>
|
||||
<optgroup class="bg-darkbg appearance-none" label="OpenAI">
|
||||
<option value="gpt35" class="bg-darkbg appearance-none">OpenAI GPT-3.5</option>
|
||||
<option value="gpt4" class="bg-darkbg appearance-none">OpenAI GPT-4</option>
|
||||
</optgroup>
|
||||
<optgroup class="bg-darkbg appearance-none" label="Other Providers">
|
||||
<option value="palm2" class="bg-darkbg appearance-none">Google Palm2</option>
|
||||
{#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 $customProviderStore.length > 0}
|
||||
{#if $DataBase.plugins.length > 0}
|
||||
<option value="custom" class="bg-darkbg appearance-none">Plugin</option>
|
||||
{/if}
|
||||
</optgroup>
|
||||
</select>
|
||||
|
||||
{#if $DataBase.aiModel === 'palm2' || $DataBase.subModel === 'palm2'}
|
||||
@@ -78,6 +92,11 @@
|
||||
{/each}
|
||||
</select>
|
||||
{/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'}
|
||||
<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}>
|
||||
@@ -98,12 +117,15 @@
|
||||
|
||||
<span class="text-gray-400 mb-6 text-sm">{tokens.globalNote} {language.tokens}</span>
|
||||
<span class="text-neutral-200">{language.maxContextSize}</span>
|
||||
|
||||
{#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}>
|
||||
{: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}>
|
||||
{: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}>
|
||||
{: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}
|
||||
<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}>
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user