[feat] nai improvements, better authornote

This commit is contained in:
kwaroran
2023-09-09 08:23:15 +09:00
parent a9564189c4
commit a122e1cc5d
9 changed files with 92 additions and 54 deletions

View File

@@ -433,4 +433,5 @@ export const languageEnglish = {
textAdventureNAI: "Run as Text Adventure", textAdventureNAI: "Run as Text Adventure",
appendNameNAI: "Append Name on NAI", appendNameNAI: "Append Name on NAI",
customStopWords: "Custom Stop Words", customStopWords: "Custom Stop Words",
defaultPrompt: "Default Prompt",
} }

View File

@@ -9,7 +9,7 @@
import LoreBook from "./LoreBook/LoreBookSetting.svelte"; import LoreBook from "./LoreBook/LoreBookSetting.svelte";
import { alertConfirm, alertError, alertNormal, alertSelectChar, alertTOS } from "../../ts/alert"; import { alertConfirm, alertError, alertNormal, alertSelectChar, alertTOS } from "../../ts/alert";
import BarIcon from "./BarIcon.svelte"; import BarIcon from "./BarIcon.svelte";
import { findCharacterbyId, selectMultipleFile } from "../../ts/util"; import { findCharacterbyId, getAuthorNoteDefaultText, selectMultipleFile } from "../../ts/util";
import { onDestroy } from "svelte"; import { onDestroy } from "svelte";
import {isEqual, cloneDeep} from 'lodash' import {isEqual, cloneDeep} from 'lodash'
import Help from "../Others/Help.svelte"; import Help from "../Others/Help.svelte";
@@ -225,7 +225,12 @@
{/if} {/if}
<span class="text-textcolor">{language.authorNote} <Help key="chatNote"/></span> <span class="text-textcolor">{language.authorNote} <Help key="chatNote"/></span>
<TextAreaInput margin="both" autocomplete="off" bind:value={currentChar.data.chats[currentChar.data.chatPage].note}></TextAreaInput> <TextAreaInput
margin="both"
autocomplete="off"
bind:value={currentChar.data.chats[currentChar.data.chatPage].note}
placeholder={getAuthorNoteDefaultText()}
/>
<span class="text-textcolor2 mb-6 text-sm">{tokens.localNote} {language.tokens}</span> <span class="text-textcolor2 mb-6 text-sm">{tokens.localNote} {language.tokens}</span>
<div class="flex mt-6 items-center"> <div class="flex mt-6 items-center">
<Check bind:check={$DataBase.jailbreakToggle} name={language.jailbreakToggle}/> <Check bind:check={$DataBase.jailbreakToggle} name={language.jailbreakToggle}/>

View File

@@ -77,10 +77,14 @@
}} /> }} />
{/if} {/if}
{/if} {/if}
{#if proompt.type === 'persona' || proompt.type === 'description'} {#if proompt.type === 'authornote'}
<span>{language.defaultPrompt}</span>
<TextInput bind:value={proompt.defaultText} />
{/if}
{#if proompt.type === 'persona' || proompt.type === 'description' || proompt.type === 'authornote'}
{#if !proompt.innerFormat} {#if !proompt.innerFormat}
<CheckInput name={language.customInnerFormat} check={false} className="mt-2" onChange={() => { <CheckInput name={language.customInnerFormat} check={false} className="mt-2" onChange={() => {
if(proompt.type === 'persona' || proompt.type === 'description'){ if(proompt.type === 'persona' || proompt.type === 'description' || proompt.type === 'authornote'){
proompt.innerFormat = "{{slot}}" proompt.innerFormat = "{{slot}}"
} }
}} /> }} />
@@ -88,7 +92,7 @@
<span>{language.innerFormat}</span> <span>{language.innerFormat}</span>
<TextAreaInput bind:value={proompt.innerFormat}/> <TextAreaInput bind:value={proompt.innerFormat}/>
<CheckInput name={language.customInnerFormat} check={true} className="mt-2" onChange={() => { <CheckInput name={language.customInnerFormat} check={true} className="mt-2" onChange={() => {
if(proompt.type === 'persona' || proompt.type === 'description'){ if(proompt.type === 'persona' || proompt.type === 'description' || proompt.type === 'authornote'){
proompt.innerFormat = null proompt.innerFormat = null
} }
}} /> }} />

View File

@@ -304,7 +304,14 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
break break
} }
case 'authornote':{ case 'authornote':{
await tokenizeChatArray(unformated.authorNote) let pmt = cloneDeep(unformated.authorNote)
if(card.innerFormat && pmt.length > 0){
for(let i=0;i<pmt.length;i++){
pmt[i].content = risuChatParser(card.innerFormat, {chara: currentChar}).replace('{{slot}}', pmt[i].content || card.defaultText || '')
}
}
await tokenizeChatArray(pmt)
break break
} }
case 'lorebook':{ case 'lorebook':{
@@ -588,7 +595,14 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
break break
} }
case 'authornote':{ case 'authornote':{
pushPrompts(unformated.authorNote) let pmt = cloneDeep(unformated.authorNote)
if(card.innerFormat && pmt.length > 0){
for(let i=0;i<pmt.length;i++){
pmt[i].content = risuChatParser(card.innerFormat, {chara: currentChar}).replace('{{slot}}', pmt[i].content || card.defaultText || '')
}
}
pushPrompts(pmt)
break break
} }
case 'lorebook':{ case 'lorebook':{
@@ -705,6 +719,7 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
useStreaming: true, useStreaming: true,
isGroupChat: nowChatroom.type === 'group', isGroupChat: nowChatroom.type === 'group',
bias: {}, bias: {},
continue: arg.continue,
}, 'model', abortSignal) }, 'model', abortSignal)
let result = '' let result = ''

View File

@@ -6,8 +6,6 @@ import { alertError, alertInput, alertNormal, alertWait } from "src/ts/alert"
import { sleep } from "src/ts/util" import { sleep } from "src/ts/util"
export function stringlizeNAIChat(formated:OpenAIChat[], char:string, continued: boolean){ export function stringlizeNAIChat(formated:OpenAIChat[], char:string, continued: boolean){
const db = get(DataBase) const db = get(DataBase)
let seperator = db.NAIsettings.seperator.replaceAll("\\n","\n") || '\n' let seperator = db.NAIsettings.seperator.replaceAll("\\n","\n") || '\n'
let starter = db.NAIsettings.starter.replaceAll("\\n","\n") || '⁂' let starter = db.NAIsettings.starter.replaceAll("\\n","\n") || '⁂'

View File

@@ -1,4 +1,4 @@
export type Proompt = ProomptPlain|ProomptTyped|ProomptChat; export type Proompt = ProomptPlain|ProomptTyped|ProomptChat|ProomptAuthorNote;
export interface ProomptPlain { export interface ProomptPlain {
type: 'plain'|'jailbreak'; type: 'plain'|'jailbreak';
@@ -8,10 +8,16 @@ export interface ProomptPlain {
} }
export interface ProomptTyped { export interface ProomptTyped {
type: 'persona'|'description'|'authornote'|'lorebook'|'postEverything' type: 'persona'|'description'|'lorebook'|'postEverything'
innerFormat?: string innerFormat?: string
} }
export interface ProomptAuthorNote {
type : 'authornote'
innerFormat?: string
defaultText?: string
}
export interface ProomptChat { export interface ProomptChat {
type: 'chat'; type: 'chat';

View File

@@ -471,17 +471,17 @@ export const prebuiltPresets:{OAI:botPreset,ooba:botPreset,NAI:botPreset,oobaRp:
] ]
}, },
"NAI2": { "NAI2": {
"name": "New Preset", "name": "Carefree",
"apiType": "gpt35", "apiType": "gpt35",
"openAIKey": "", "openAIKey": "",
"mainPrompt": "", "mainPrompt": "",
"jailbreak": "", "jailbreak": "",
"globalNote": "", "globalNote": "",
"temperature": 136, "temperature": 135,
"maxContext": 4000, "maxContext": 4000,
"maxResponse": 500, "maxResponse": 500,
"frequencyPenalty": 70, "frequencyPenalty": 70,
"PresensePenalty": 70, "PresensePenalty": 0,
"formatingOrder": [ "formatingOrder": [
"main", "main",
"description", "description",
@@ -501,32 +501,7 @@ export const prebuiltPresets:{OAI:botPreset,ooba:botPreset,NAI:botPreset,oobaRp:
"forceReplaceUrl": "", "forceReplaceUrl": "",
"forceReplaceUrl2": "", "forceReplaceUrl2": "",
"promptPreprocess": false, "promptPreprocess": false,
"bias": [ "bias": [],
[
"{{char}}:",
-10
],
[
"{{user}}:",
-10
],
[
"\\n{{char}}:",
-10
],
[
"\\n{{user}}:",
-10
],
[
"\\n{{char}} :",
-10
],
[
"\\n{{user}} :",
-10
]
],
"koboldURL": null, "koboldURL": null,
"proxyKey": "", "proxyKey": "",
"ooba": { "ooba": {
@@ -576,7 +551,7 @@ export const prebuiltPresets:{OAI:botPreset,ooba:botPreset,NAI:botPreset,oobaRp:
"proxyRequestModel": "", "proxyRequestModel": "",
"openrouterRequestModel": "openai/gpt-3.5-turbo", "openrouterRequestModel": "openai/gpt-3.5-turbo",
"NAISettings": { "NAISettings": {
"topK": 12, "topK": 15,
"topP": 0.85, "topP": 0.85,
"topA": 0.1, "topA": 0.1,
"tailFreeSampling": 0.915, "tailFreeSampling": 0.915,
@@ -585,9 +560,9 @@ export const prebuiltPresets:{OAI:botPreset,ooba:botPreset,NAI:botPreset,oobaRp:
"repetitionPenaltySlope": 0.02, "repetitionPenaltySlope": 0.02,
"repostitionPenaltyPresence": 0, "repostitionPenaltyPresence": 0,
"seperator": "", "seperator": "",
"frequencyPenalty": 0.03, "frequencyPenalty": 0.02,
"presencePenalty": 0, "presencePenalty": 0,
"typicalp": 0.81, "typicalp": 1,
"starter": "", "starter": "",
"cfg_scale": 1, "cfg_scale": 1,
"mirostat_tau": 0, "mirostat_tau": 0,
@@ -610,22 +585,16 @@ export const prebuiltPresets:{OAI:botPreset,ooba:botPreset,NAI:botPreset,oobaRp:
"rangeStart": -6, "rangeStart": -6,
"rangeEnd": -4 "rangeEnd": -4
}, },
{
"type": "plain",
"text": "----",
"role": "system",
"type2": "normal"
},
{ {
"type": "persona", "type": "persona",
"innerFormat": null "innerFormat": "----\n{{slot}}"
}, },
{ {
"type": "lorebook" "type": "lorebook"
}, },
{ {
"type": "description", "type": "description",
"innerFormat": null "innerFormat": "----\n{{slot}}"
}, },
{ {
"type": "plain", "type": "plain",
@@ -648,7 +617,7 @@ export const prebuiltPresets:{OAI:botPreset,ooba:botPreset,NAI:botPreset,oobaRp:
"rangeEnd": "end" "rangeEnd": "end"
} }
], ],
"NAIadventure": true, "NAIadventure": false,
"NAIappendName": true "NAIappendName": true
} }
} }

View File

@@ -8,7 +8,7 @@ import { clone, cloneDeep } from 'lodash';
import { defaultAutoSuggestPrompt, defaultJailbreak, defaultMainPrompt } from './defaultPrompts'; import { defaultAutoSuggestPrompt, defaultJailbreak, defaultMainPrompt } from './defaultPrompts';
import { alertNormal } from '../alert'; import { alertNormal } from '../alert';
import type { NAISettings } from '../process/models/nai'; import type { NAISettings } from '../process/models/nai';
import { prebuiltNAIpresets } 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';
@@ -955,12 +955,36 @@ export function downloadPreset(id:number){
} }
export async function importPreset(){ export async function importPreset(){
const f = await selectSingleFile(["json"]) const f = await selectSingleFile(["json", "preset"])
if(!f){ if(!f){
return return
} }
let db = get(DataBase) let db = get(DataBase)
const pre = (JSON.parse(Buffer.from(f.data).toString('utf-8'))) const pre = (JSON.parse(Buffer.from(f.data).toString('utf-8')))
if(pre.presetVersion && pre.presetVersion >= 3){
//NAI preset
const pr = cloneDeep(prebuiltPresets.NAI2)
pr.temperature = pre.parameters.temperature * 100
pr.maxResponse = pre.parameters.max_length
pr.NAISettings.topK = pre.parameters.top_k
pr.NAISettings.topP = pre.parameters.top_p
pr.NAISettings.topA = pre.parameters.top_a
pr.NAISettings.typicalp = pre.parameters.typical_p
pr.NAISettings.tailFreeSampling = pre.parameters.tail_free_sampling
pr.NAISettings.repetitionPenalty = pre.parameters.repetition_penalty
pr.NAISettings.repetitionPenaltyRange = pre.parameters.repetition_penalty_range
pr.NAISettings.repetitionPenaltySlope = pre.parameters.repetition_penalty_slope
pr.NAISettings.frequencyPenalty = pre.parameters.repetition_penalty_frequency
pr.NAISettings.repostitionPenaltyPresence = pre.parameters.repetition_penalty_presence
pr.PresensePenalty = pre.parameters.repetition_penalty_presence * 100
pr.NAISettings.cfg_scale = pre.parameters.cfg_scale
pr.NAISettings.mirostat_lr = pre.parameters.mirostat_lr
pr.NAISettings.mirostat_tau = pre.parameters.mirostat_tau
pr.name = pre.name ?? "Imported"
db.botPresets.push(pr)
setDatabase(db)
return
}
pre.name ??= "Imported" pre.name ??= "Imported"
db.botPresets.push(pre) db.botPresets.push(pre)
setDatabase(db) setDatabase(db)

View File

@@ -293,4 +293,20 @@ export async function getEmotion(db:Database,chaEmotion:{[key:string]: [string,
} }
} }
return datas return datas
}
export function getAuthorNoteDefaultText(){
const db = get(DataBase)
const template = db.promptTemplate
if(!template){
return ''
}
for(const v of template){
if(v.type === 'authornote'){
return v.defaultText ?? ''
}
}
return ''
} }