Update to 1.19.0 (#114)
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
},
|
},
|
||||||
"package": {
|
"package": {
|
||||||
"productName": "RisuAI",
|
"productName": "RisuAI",
|
||||||
"version": "1.18.2"
|
"version": "1.19.0"
|
||||||
},
|
},
|
||||||
"tauri": {
|
"tauri": {
|
||||||
"allowlist": {
|
"allowlist": {
|
||||||
|
|||||||
@@ -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}>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
15
src/lib/UI/Arcodion.svelte
Normal file
15
src/lib/UI/Arcodion.svelte
Normal 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>
|
||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
@@ -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[]> {
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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}:`)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"version":"1.18.2"}
|
{"version":"1.19.0"}
|
||||||
Reference in New Issue
Block a user