[feat] ooba mode

This commit is contained in:
kwaroran
2023-11-16 04:02:59 +09:00
parent c4efe0b149
commit 714c81017d
9 changed files with 254 additions and 1 deletions

View File

@@ -449,4 +449,5 @@ export const languageEnglish = {
largePortrait: "Portrait", largePortrait: "Portrait",
postImage: "Post Image", postImage: "Post Image",
lorePlus: "LoreBook+", lorePlus: "LoreBook+",
reverseProxyOobaMode: "Reverse Proxy Ooba Mode"
} }

View File

@@ -21,6 +21,7 @@
import { openRouterModels } from "src/ts/model/openrouter"; import { openRouterModels } from "src/ts/model/openrouter";
import { novelLogin } from "src/ts/process/models/nai"; import { novelLogin } from "src/ts/process/models/nai";
import { alertConfirm } from "src/ts/alert"; import { alertConfirm } from "src/ts/alert";
import OobaSettings from "./OobaSettings.svelte";
let tokens = { let tokens = {
mainPrompt: 0, mainPrompt: 0,
@@ -160,6 +161,9 @@
{:else} {:else}
<div class="mb-4"></div> <div class="mb-4"></div>
{/if} {/if}
<div class="flex items-center mt-2 mb-4">
<Check bind:check={$DataBase.reverseProxyOobaMode} name={`${language.reverseProxyOobaMode}`}/>
</div>
{/if} {/if}
{#if $DataBase.aiModel === 'openrouter' || $DataBase.subModel === 'openrouter'} {#if $DataBase.aiModel === 'openrouter' || $DataBase.subModel === 'openrouter'}
<span class="text-textcolor mt-4">Openrouter Key</span> <span class="text-textcolor mt-4">Openrouter Key</span>
@@ -459,6 +463,9 @@
{/if} {/if}
{/if} {/if}
{#if ($DataBase.reverseProxyOobaMode && $DataBase.aiModel === 'reverse_proxy')}
<OobaSettings />
{/if}
{#if advancedBotSettings} {#if advancedBotSettings}

View File

@@ -0,0 +1,130 @@
<script lang="ts">
import TextInput from "src/lib/UI/GUI/TextInput.svelte";
import NumberInput from "src/lib/UI/GUI/NumberInput.svelte";
import SelectInput from "src/lib/UI/GUI/SelectInput.svelte";
import OptionInput from "src/lib/UI/GUI/OptionInput.svelte";
import OptionalInput from "src/lib/UI/GUI/OptionalInput.svelte";
import { DataBase } from "src/ts/storage/database";
let openOobaSettings = false
const toggleOobaSettings = () => {
openOobaSettings = !openOobaSettings
}
</script>
<div class="border-darkborderc border px-2 flex flex-col py-4 rounded-md">
{#if !openOobaSettings}
<button on:click={toggleOobaSettings}>
⮞ Ooba Settings
</button>
{:else}
<button on:click={toggleOobaSettings}>
⮟ Ooba Settings
</button>
<div class="border-b border-b-darkborderc mt-4 mb-4">
</div>
<span class="text-textcolor">Ooba Mode</span>
<SelectInput className="mt-2 mb-4" bind:value={$DataBase.reverseProxyOobaArgs.mode}>
<OptionInput value="instruct">Instruct</OptionInput>
<OptionInput value="chat">Chat</OptionInput>
<OptionInput value="chat-instruct">Chat-Instruct</OptionInput>
</SelectInput>
<!-- name1 = user | name2 = bot --->
{#if $DataBase.reverseProxyOobaArgs.mode === 'instruct'}
<span class="text-textcolor">user prefix</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.name1_instruct} />
<span class="text-textcolor">bot prefix</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.name2_instruct} />
<span class="text-textcolor">system prefix</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.context_instruct} />
<span class="text-textcolor">system message</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.system_message} />
{/if}
{#if $DataBase.reverseProxyOobaArgs.mode === 'chat' || $DataBase.reverseProxyOobaArgs.mode === 'chat-instruct'}
<span class="text-textcolor">user prefix</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.name1} />
<span class="text-textcolor">bot prefix</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.name2} />
<span class="text-textcolor">system prefix</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.context} />
<span class="text-textcolor">start message</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.greeting} />
{/if}
{#if $DataBase.reverseProxyOobaArgs.mode === 'chat-instruct'}
<span class="text-textcolor">chat_instruct_command</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.chat_instruct_command} />
{/if}
<span class="text-textcolor">min_p</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.min_p} numberMode />
<span class="text-textcolor">top_k</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.top_k} numberMode />
<span class="text-textcolor">repetition_penalty</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.repetition_penalty} numberMode />
<span class="text-textcolor">repetition_penalty_range</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.repetition_penalty_range} numberMode />
<span class="text-textcolor">typical_p</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.typical_p} numberMode />
<span class="text-textcolor">tfs</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.tfs} numberMode />
<span class="text-textcolor">top_a</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.top_a} numberMode />
<span class="text-textcolor">epsilon_cutoff</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.epsilon_cutoff} numberMode />
<span class="text-textcolor">eta_cutoff</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.eta_cutoff} numberMode />
<span class="text-textcolor">guidance_scale</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.guidance_scale} numberMode />
<span class="text-textcolor">penalty_alpha</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.penalty_alpha} numberMode />
<span class="text-textcolor">mirostat_mode</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.mirostat_mode} numberMode />
<span class="text-textcolor">mirostat_tau</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.mirostat_tau} numberMode />
<span class="text-textcolor">mirostat_eta</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.mirostat_eta} numberMode />
<span class="text-textcolor">encoder_repetition_penalty</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.encoder_repetition_penalty} numberMode />
<span class="text-textcolor">no_repeat_ngram_size</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.no_repeat_ngram_size} numberMode />
<span class="text-textcolor">min_length</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.min_length} numberMode />
<span class="text-textcolor">num_beams</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.num_beams} numberMode />
<span class="text-textcolor">length_penalty</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.length_penalty} numberMode />
<span class="text-textcolor">truncation_length</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.truncation_length} numberMode />
<span class="text-textcolor">max_tokens_second</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.max_tokens_second} numberMode />
<span class="text-textcolor">negative_prompt</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.negative_prompt} />
<span class="text-textcolor">custom_token_bans</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.custom_token_bans} />
<span class="text-textcolor">grammar_string</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.grammar_string} />
<span class="text-textcolor">custom_token_bans</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.custom_token_bans} />
<span class="text-textcolor">grammar_string</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.grammar_string} />
<span class="text-textcolor">temperature_last</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.temperature_last} boolMode />
<span class="text-textcolor">do_sample</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.do_sample} boolMode />
<span class="text-textcolor">early_stopping</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.early_stopping} boolMode />
<span class="text-textcolor">auto_max_new_tokens</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.auto_max_new_tokens} boolMode />
<span class="text-textcolor">ban_eos_token</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.ban_eos_token} boolMode />
<span class="text-textcolor">add_bos_token</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.add_bos_token} boolMode />
<span class="text-textcolor">skip_special_tokens</span>
<OptionalInput marginBottom={true} bind:value={$DataBase.reverseProxyOobaArgs.skip_special_tokens} boolMode />
{/if}
</div>

View File

@@ -0,0 +1,46 @@
<script lang="ts">
import CheckInput from "./CheckInput.svelte";
import NumberInput from "./NumberInput.svelte";
import TextInput from "./TextInput.svelte";
export let value:string|number|boolean
export let numberMode = false
export let boolMode = false
export let marginBottom = false
const valToggle = () => {
value = !value
}
</script>
<div class="flex items-center justify-center" class:mb-4={marginBottom}>
<div class="flex justify-center items-center border-darkborderc rounded-l-md rounded-t-md rounded-b-md border h-full">
<CheckInput hiddenName check={!(value === null || value === undefined)} onChange={() => {
if(value === null || value === undefined){
if(numberMode){
value = 0
}
else if(boolMode){
value = false
}
else{
value = ""
}
}
else{
value = null
}
}} />
</div>
{#if (value === null || value === undefined)}
<TextInput value={"Using default"} additionalClass="flex-1" disabled/>
{:else if typeof(value) === 'string'}
<TextInput bind:value={value} additionalClass="flex-1"/>
{:else if typeof(value) === 'number'}
<NumberInput bind:value={value} additionalClass="flex-1"/>
{:else if typeof(value) === 'boolean'}
<button class="px-2 py-2 border border-darkborderc flex-1" class:text-textcolor2={!value} on:click={valToggle}>True</button>
<button class="px-2 py-2 border border-darkborderc flex-1" class:text-textcolor2={value} on:click={valToggle}>False</button>
{:else}
<TextInput value={"Using default"} additionalClass="flex-1" disabled/>
{/if}
</div>

View File

@@ -16,11 +16,13 @@
class:mt-4={marginTop} class:mt-4={marginTop}
class:w-full={fullwidth} class:w-full={fullwidth}
class:h-full={fullh} class:h-full={fullh}
class:text-textcolor2={disabled}
{autocomplete} {autocomplete}
{placeholder} {placeholder}
id={id} id={id}
type="text" type="text"
bind:value bind:value
disabled={disabled}
on:input={onInput} on:input={onInput}
/> />
@@ -38,4 +40,5 @@
export let fullwidth = false export let fullwidth = false
export let fullh = false export let fullh = false
export let additionalClass = '' export let additionalClass = ''
export let disabled = false
</script> </script>

47
src/ts/model/ooba.ts Normal file
View File

@@ -0,0 +1,47 @@
export interface OobaChatCompletionRequestParams {
mode: 'instruct'|'chat'|'chat-instruct'
turn_template?: string
name1_instruct?: string
name2_instruct?: string
context_instruct?: string
system_message?: string
name1?: string
name2?: string
context?: string
greeting?: string
chat_instruct_command?: string
preset?: string; // The '?' denotes that the property is optional
min_p?: number;
top_k?: number;
repetition_penalty?: number;
repetition_penalty_range?: number;
typical_p?: number;
tfs?: number;
top_a?: number;
epsilon_cutoff?: number;
eta_cutoff?: number;
guidance_scale?: number;
negative_prompt?: string;
penalty_alpha?: number;
mirostat_mode?: number;
mirostat_tau?: number;
mirostat_eta?: number;
temperature_last?: boolean;
do_sample?: boolean;
seed?: number;
encoder_repetition_penalty?: number;
no_repeat_ngram_size?: number;
min_length?: number;
num_beams?: number;
length_penalty?: number;
early_stopping?: boolean;
truncation_length?: number;
max_tokens_second?: number;
custom_token_bans?: string;
auto_max_new_tokens?: boolean;
ban_eos_token?: boolean;
add_bos_token?: boolean;
skip_special_tokens?: boolean;
grammar_string?: string;
}

View File

@@ -295,6 +295,18 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
body.user = getOpenUserString() body.user = getOpenUserString()
} }
if(aiModel === 'reverse_proxy' && db.reverseProxyOobaMode){
const OobaBodyTemplate = db.reverseProxyOobaArgs
const keys = Object.keys(OobaBodyTemplate)
for(const key of keys){
if(OobaBodyTemplate[key] !== undefined && OobaBodyTemplate[key] !== null){
// @ts-ignore
body[key] = OobaBodyTemplate[key]
}
}
}
if(supportsInlayImage()){ if(supportsInlayImage()){
// inlay models doesn't support logit_bias // inlay models doesn't support logit_bias
// @ts-ignore // @ts-ignore

View File

@@ -11,6 +11,7 @@ import type { NAISettings } from '../process/models/nai';
import { prebuiltNAIpresets, prebuiltPresets } from '../process/templates/templates'; import { prebuiltNAIpresets, prebuiltPresets } from '../process/templates/templates';
import { defaultColorScheme, type ColorScheme } from '../gui/colorscheme'; import { defaultColorScheme, type ColorScheme } from '../gui/colorscheme';
import type { Proompt } from '../process/proompt'; import type { Proompt } from '../process/proompt';
import type { OobaChatCompletionRequestParams } from '../model/ooba';
export const DataBase = writable({} as any as Database) export const DataBase = writable({} as any as Database)
export const loadedStore = writable(false) export const loadedStore = writable(false)
@@ -320,6 +321,9 @@ export function setDatabase(data:Database){
data.generationSeed ??= -1 data.generationSeed ??= -1
data.newOAIHandle ??= true data.newOAIHandle ??= true
data.gptVisionQuality ??= 'low' data.gptVisionQuality ??= 'low'
data.reverseProxyOobaArgs ??= {
mode: 'instruct'
}
changeLanguage(data.language) changeLanguage(data.language)
DataBase.set(data) DataBase.set(data)
} }
@@ -499,6 +503,8 @@ export interface Database{
putUserOpen: boolean putUserOpen: boolean
inlayImage:boolean inlayImage:boolean
gptVisionQuality:string gptVisionQuality:string
reverseProxyOobaMode:boolean
reverseProxyOobaArgs: OobaChatCompletionRequestParams
} }
export interface customscript{ export interface customscript{

View File

@@ -17,9 +17,10 @@ async function encode(data:string):Promise<(number[]|Uint32Array|Int32Array)>{
if(db.aiModel.startsWith('novelai')){ if(db.aiModel.startsWith('novelai')){
return await tokenizeWebTokenizers(data, 'novelai') return await tokenizeWebTokenizers(data, 'novelai')
} }
if(db.aiModel.startsWith('local_') || db.aiModel === 'mancer' || db.aiModel === 'textgen_webui'){ if(db.aiModel.startsWith('local_') || db.aiModel === 'mancer' || db.aiModel === 'textgen_webui' || (db.aiModel === 'reverse_proxy' && db.reverseProxyOobaMode)){
return await tokenizeWebTokenizers(data, 'llama') return await tokenizeWebTokenizers(data, 'llama')
} }
return await tikJS(data) return await tikJS(data)
} }