Update to 1.19.0 (#114)

This commit is contained in:
kwaroran
2023-05-26 20:31:02 +09:00
committed by GitHub
11 changed files with 148 additions and 57 deletions

View File

@@ -8,7 +8,7 @@
}, },
"package": { "package": {
"productName": "RisuAI", "productName": "RisuAI",
"version": "1.18.2" "version": "1.19.0"
}, },
"tauri": { "tauri": {
"allowlist": { "allowlist": {

View File

@@ -69,6 +69,12 @@
{/if} {/if}
{#if $DataBase.aiModel === "kobold" || $DataBase.subModel === "kobold"}
<span class="text-neutral-200">Kobold URL</span>
<input class="text-neutral-200 p-2 bg-transparent input-text focus:bg-selected text-sm mb-2" bind:value={$DataBase.koboldURL}>
{/if}
{#if $DataBase.aiModel.startsWith("horde") || $DataBase.subModel.startsWith("horde") } {#if $DataBase.aiModel.startsWith("horde") || $DataBase.subModel.startsWith("horde") }
<span class="text-neutral-200">Horde {language.apiKey}</span> <span class="text-neutral-200">Horde {language.apiKey}</span>
<input class="text-neutral-200 p-2 bg-transparent input-text focus:bg-selected text-sm mb-2" bind:value={$DataBase.hordeConfig.apiKey}> <input class="text-neutral-200 p-2 bg-transparent input-text focus:bg-selected text-sm mb-2" bind:value={$DataBase.hordeConfig.apiKey}>

View File

@@ -13,9 +13,9 @@
import Communities from "./Pages/Communities.svelte"; import Communities from "./Pages/Communities.svelte";
import GlobalLoreBookSettings from "./Pages/GlobalLoreBookSettings.svelte"; import GlobalLoreBookSettings from "./Pages/GlobalLoreBookSettings.svelte";
import Lorepreset from "./lorepreset.svelte"; import Lorepreset from "./lorepreset.svelte";
import GlobalRegex from "./Pages/GlobalRegex.svelte"; import GlobalRegex from "./Pages/GlobalRegex.svelte";
import LanguageSettings from "./Pages/LanguageSettings.svelte"; import LanguageSettings from "./Pages/LanguageSettings.svelte";
import AccessibilitySettings from "./Pages/AccessibilitySettings.svelte"; import AccessibilitySettings from "./Pages/AccessibilitySettings.svelte";
let selected = -1 let selected = -1
let openPresetList = false let openPresetList = false
let openLoreList = false let openLoreList = false

View File

@@ -0,0 +1,15 @@
<script lang="ts">
export let name = ""
let open = false
</script>
<div class="flex flex-col">
<button class="hover:bg-selected px-6 py-2 text-lg" class:bg-selected={open} on:click={() => {
open = !open
}}>{name}</button>
{#if open}
<div class="flex flex-col bg-darkbg">
<slot></slot>
</div>
{/if}
</div>

View File

@@ -1,32 +1,74 @@
<script lang="ts"> <script lang="ts">
import { DataBase } from "src/ts/database"; import { DataBase } from "src/ts/database";
import { isTauri } from "src/ts/globalApi";
import { getHordeModels } from "src/ts/horde/getModels"; import { getHordeModels } from "src/ts/horde/getModels";
import Arcodion from "./Arcodion.svelte";
import { language } from "src/lang";
export let value = "" export let value = ""
let openOptions = false
function getModelName(name:string){
switch(name){
case "gpt35":
return "GPT-3.5 Turbo"
case "gpt4":
return "GPT-4"
case "palm2":
return "PaLM2"
case "textgen_webui":
return "Oobabooga WebUI"
case "kobold":
return "Kobold"
case "custom":
return "Plugin"
default:
if(name.startsWith("horde:::")){
return name.replace(":::", " ")
}
return ''
}
}
function changeModel(name:string){
value = name
openOptions = false
}
</script> </script>
{#await getHordeModels()} {#if openOptions}
<select class="bg-transparent input-text mt-2 mb-2 text-gray-200 appearance-none text-sm" value=""> <!-- svelte-ignore a11y-click-events-have-key-events -->
<option value="" class="bg-darkbg appearance-none">Loading...</option> <div class="fixed top-0 w-full h-full left-0 bg-black bg-opacity-50 z-50 flex justify-center items-center" on:click={() => {
</select> openOptions = false
{:then models} }}>
<select class="bg-transparent input-text mt-2 mb-2 text-gray-200 appearance-none text-sm" bind:value> <div class="w-96 max-w-full max-h-full overflow-y-auto overflow-x-hidden bg-bgcolor p-4 flex flex-col" on:click|stopPropagation>
<optgroup class="bg-darkbg appearance-none" label="OpenAI"> <h1 class="font-bold text-xl">{language.model}</h1>
<option value="gpt35" class="bg-darkbg appearance-none">OpenAI GPT-3.5</option> <div class="border-t-1 border-y-selected mt-1 mb-1"></div>
<option value="gpt4" class="bg-darkbg appearance-none">OpenAI GPT-4</option> <Arcodion name="OpenAI GPT">
</optgroup> <button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt35')}}>GPT-3.5 Turbo</button>
<optgroup class="bg-darkbg appearance-none" label="Other Providers"> <button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt4')}}>GPT-4</button>
<option value="palm2" class="bg-darkbg appearance-none">Google Palm2</option> </Arcodion>
<option value="textgen_webui" class="bg-darkbg appearance-none">Text Generation WebUI</option> <button class="hover:bg-selected px-6 py-2 text-lg" on:click={() => {changeModel('textgen_webui')}}>Oobabooga WebUI</button>
<button class="hover:bg-selected px-6 py-2 text-lg" on:click={() => {changeModel('palm2')}}>Google PaLM2</button>
<button class="hover:bg-selected px-6 py-2 text-lg" on:click={() => {changeModel('kobold')}}>Kobold</button>
<Arcodion name="Horde">
{#await getHordeModels()}
<button class="p-2">Loading...</button>
{:then models}
{#each models as model}
<button on:click={() => {changeModel("horde:::" + model)}} class="p-2 hover:text-green-500">{model.trim()}</button>
{/each}
{/await}
</Arcodion>
{#if $DataBase.plugins.length > 0} {#if $DataBase.plugins.length > 0}
<option value="custom" class="bg-darkbg appearance-none">Plugin</option> <button on:click={() => {changeModel('plugin')}} class="hover:bg-selected px-6 py-2 text-lg" >Plugin</button>
{/if} {/if}
</optgroup> </div>
<!-- <optgroup class="bg-darkbg appearance-none" label="Horde"> </div>
{#each models as model}
<option value={"horde:::" + model} class="bg-darkbg appearance-none">{model}</option> {/if}
{/each}
</optgroup> --> <button on:click={() => {openOptions = true}}
</select> class="mt-4 drop-shadow-lg p-3 flex justify-center items-center ml-2 mr-2 rounded-lg bg-selected mb-4">
{/await} {getModelName(value)}
</button>

View File

@@ -7,7 +7,7 @@ import { cloneDeep } from 'lodash';
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)
export let appVer = '1.18.2' export let appVer = '1.19.0'
export function setDatabase(data:Database){ export function setDatabase(data:Database){
@@ -386,6 +386,7 @@ export interface botPreset{
forceReplaceUrl2:string forceReplaceUrl2:string
promptPreprocess: boolean, promptPreprocess: boolean,
bias: [string, number][] bias: [string, number][]
koboldURL?: string
} }
export interface Database{ export interface Database{
@@ -486,6 +487,7 @@ export interface Database{
globalscript: customscript[] globalscript: customscript[]
sendWithEnter:boolean sendWithEnter:boolean
clickToEdit: boolean clickToEdit: boolean
koboldURL:string
} }
@@ -627,7 +629,9 @@ export function saveCurrentPreset(){
forceReplaceUrl: db.forceReplaceUrl, forceReplaceUrl: db.forceReplaceUrl,
forceReplaceUrl2: db.forceReplaceUrl2, forceReplaceUrl2: db.forceReplaceUrl2,
promptPreprocess: db.promptPreprocess, promptPreprocess: db.promptPreprocess,
bias: db.bias bias: db.bias,
koboldURL: db.koboldURL
} }
db.botPresets = pres db.botPresets = pres
DataBase.set(db) DataBase.set(db)
@@ -668,5 +672,6 @@ export function changeToPreset(id =0){
db.promptPreprocess = newPres.promptPreprocess ?? db.promptPreprocess db.promptPreprocess = newPres.promptPreprocess ?? db.promptPreprocess
db.forceReplaceUrl2 = newPres.forceReplaceUrl2 ?? db.forceReplaceUrl2 db.forceReplaceUrl2 = newPres.forceReplaceUrl2 ?? db.forceReplaceUrl2
db.bias = newPres.bias ?? db.bias db.bias = newPres.bias ?? db.bias
db.koboldURL = newPres.koboldURL ?? db.koboldURL
DataBase.set(db) DataBase.set(db)
} }

View File

@@ -3,7 +3,7 @@ import { sleep } from "../util"
let modelList:string[]|'loading' = null let modelList:string[]|'loading' = null
//until horde is ready //until horde is ready
modelList = [] // modelList = []
export async function getHordeModels():Promise<string[]> { export async function getHordeModels():Promise<string[]> {

View File

@@ -241,7 +241,7 @@ export async function sendChat(chatProcessIndex = -1):Promise<boolean> {
else{ else{
while(currentTokens > maxContextTokens){ while(currentTokens > maxContextTokens){
if(chats.length <= 1){ if(chats.length <= 1){
alertError(language.errors.toomuchtoken) alertError(language.errors.toomuchtoken + "\n\nRequired Tokens: " + currentTokens)
return false return false
} }

View File

@@ -23,6 +23,7 @@ interface requestDataArgument{
type requestDataResponse = { type requestDataResponse = {
type: 'success'|'fail' type: 'success'|'fail'
result: string result: string
noRetry?: boolean
}|{ }|{
type: "streaming", type: "streaming",
result: ReadableStream<string> result: ReadableStream<string>
@@ -33,11 +34,11 @@ export async function requestChatData(arg:requestDataArgument, model:'model'|'su
let trys = 0 let trys = 0
while(true){ while(true){
const da = await requestChatDataMain(arg, model) const da = await requestChatDataMain(arg, model)
if(da.type === 'success' || da.type === 'streaming'){ if(da.type === 'success' || da.type === 'streaming' || da.noRetry){
return da return da
} }
trys += 1 trys += 1
if(trys > db.requestRetrys || model.startsWith('horde')){ if(trys > db.requestRetrys){
return da return da
} }
} }
@@ -417,31 +418,50 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
} }
} }
} }
case "kobold":{
const proompt = stringlizeChat(formated, currentChar?.name ?? '')
const url = new URL(db.koboldURL)
url.pathname = '/generate'
const da = await fetch(url, {
method: "POST",
body: JSON.stringify({
"prompt": proompt,
"temperature": db.temperature,
"top_p": 0.9
}),
headers: {
"content-type": "application/json",
}
})
if(da.status !== 200){
return {
type: "fail",
result: await da.text(),
noRetry: da.status >= 500
}
}
const data = await da.json()
return data.results[0].text
}
default:{ default:{
if(aiModel.startsWith("horde:::")){ if(aiModel.startsWith("horde:::")){
const realModel = aiModel.split(":::")[1].trim() const proompt = stringlizeChat(formated, currentChar?.name ?? '')
const workers = ((await (await fetch("https://stablehorde.net/api/v2/workers")).json()) as {id:string,models:string[]}[]).filter((a) => { const realModel = aiModel.split(":::")[1]
if(a && a.models && a.id){
console.log(a)
return a.models.includes(realModel)
}
return false
}).map((a) => {
return a.id
})
const argument = { const argument = {
"prompt": "string", "prompt": proompt,
"params": { "params": {
"n": 1, "n": 1,
"frmtadsnsp": false, "frmtadsnsp": false,
"frmtrmblln": false, "frmtrmblln": false,
"frmtrmspch": false, "frmtrmspch": false,
"frmttriminc": false, "frmttriminc": false,
"max_context_length": 200, "max_context_length": db.maxContext + 100,
"max_length": 20, "max_length": db.maxResponse,
"rep_pen": 3, "rep_pen": 3,
"rep_pen_range": 0, "rep_pen_range": 0,
"rep_pen_slope": 10, "rep_pen_slope": 10,
@@ -459,7 +479,8 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
"trusted_workers": false, "trusted_workers": false,
"slow_workers": true, "slow_workers": true,
"worker_blacklist": false, "worker_blacklist": false,
"dry_run": false "dry_run": false,
"models": [realModel]
} }
const da = await fetch("https://stablehorde.net/api/v2/generate/text/async", { const da = await fetch("https://stablehorde.net/api/v2/generate/text/async", {
@@ -485,12 +506,12 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
} = await da.json() } = await da.json()
let warnMessage = "" let warnMessage = ""
if(json.message && json.message.startsWith("Warning:")){ if(json.message){
warnMessage = "with " + json.message warnMessage = "with " + json.message
} }
while(true){ while(true){
await sleep(1000) await sleep(2000)
const data = await (await fetch("https://stablehorde.net/api/v2/generate/text/status/" + json.id)).json() const data = await (await fetch("https://stablehorde.net/api/v2/generate/text/status/" + json.id)).json()
if(!data.is_possible){ if(!data.is_possible){
fetch("https://stablehorde.net/api/v2/generate/text/status/" + json.id, { fetch("https://stablehorde.net/api/v2/generate/text/status/" + json.id, {
@@ -498,20 +519,22 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
}) })
return { return {
type: 'fail', type: 'fail',
result: "Response not possible" + warnMessage result: "Response not possible" + warnMessage,
noRetry: true
} }
} }
if(data.done){ if(data.done && Array.isArray(data.generations) && data.generations.length > 0){
const generations:{text:string}[] = data.generations const generations:{text:string}[] = data.generations
if(generations && generations.length > 0){ if(generations && generations.length > 0){
return { return {
type: "success", type: "success",
result: generations[0].text result: unstringlizeChat(generations[0].text, formated, currentChar?.name ?? '')
} }
} }
return { return {
type: 'fail', type: 'fail',
result: "No Generations when done" result: "No Generations when done",
noRetry: true
} }
} }
} }

View File

@@ -8,7 +8,7 @@ export function stringlizeChat(formated:OpenAIChat[], char:string = ''){
let resultString:string[] = [] let resultString:string[] = []
for(const form of formated){ for(const form of formated){
if(form.role === 'system'){ if(form.role === 'system'){
resultString.push("system note: " + form.content) resultString.push("system: " + form.content)
} }
else if(form.name){ else if(form.name){
resultString.push(form.name + ": " + form.content) resultString.push(form.name + ": " + form.content)
@@ -23,7 +23,7 @@ export function stringlizeChat(formated:OpenAIChat[], char:string = ''){
export function unstringlizeChat(text:string, formated:OpenAIChat[], char:string = ''){ export function unstringlizeChat(text:string, formated:OpenAIChat[], char:string = ''){
console.log(text) console.log(text)
let minIndex = -1 let minIndex = -1
let chunks:string[] = ["system note:"] let chunks:string[] = ["system note:", "system:"]
if(char){ if(char){
chunks.push(`${char}:`) chunks.push(`${char}:`)
} }

View File

@@ -1 +1 @@
{"version":"1.18.2"} {"version":"1.19.0"}