diff --git a/src/lib/Setting/Pages/BotSettings.svelte b/src/lib/Setting/Pages/BotSettings.svelte index 757a1f58..1adb3629 100644 --- a/src/lib/Setting/Pages/BotSettings.svelte +++ b/src/lib/Setting/Pages/BotSettings.svelte @@ -295,6 +295,38 @@ {/if} +{:else if $DataBase.aiModel.startsWith('novelai')} + Top P + + {($DataBase.NAIsettings.topP).toFixed(2)} + Top P + + {($DataBase.NAIsettings.topK).toFixed(0)} + Top A + + {($DataBase.NAIsettings.topA).toFixed(2)} + Tailfree Sampling + + {($DataBase.NAIsettings.tailFreeSampling).toFixed(3)} + Typical P + + {($DataBase.NAIsettings.tailFreeSampling).toFixed(2)} + Repetition Penalty + + {($DataBase.NAIsettings.repetitionPenalty).toFixed(2)} + Repetition Penalty Range + + {($DataBase.NAIsettings.repetitionPenaltyRange).toFixed(0)} + Repetition Penalty Slope + + {($DataBase.NAIsettings.repetitionPenaltySlope).toFixed(2)} + Frequency Penalty + + {($DataBase.NAIsettings.frequencyPenalty).toFixed(2)} + Presence Penalty + + {($DataBase.NAIsettings.presencePenalty).toFixed(2)} + {:else if $DataBase.aiModel.startsWith('novellist')} Top P diff --git a/src/lib/UI/ModelList.svelte b/src/lib/UI/ModelList.svelte index cb8894ba..6c05168c 100644 --- a/src/lib/UI/ModelList.svelte +++ b/src/lib/UI/ModelList.svelte @@ -43,7 +43,7 @@ case "novelai": return "NovelAI" case "novelai_kayra": - return "NovelAI_kayra" + return "NovelAI Kayra" case "novellist": return "NovelList SuperTrin" case "novellist damsel": diff --git a/src/ts/process/models/nai.ts b/src/ts/process/models/nai.ts new file mode 100644 index 00000000..28779b8e --- /dev/null +++ b/src/ts/process/models/nai.ts @@ -0,0 +1,363 @@ +import { DataBase } from "src/ts/storage/database" +import type { OpenAIChat } from ".." +import { get } from "svelte/store" + +export function stringlizeNAIChat(formated:OpenAIChat[], char:string = ''){ + const db = get(DataBase) + let resultString:string[] = [] + for(const form of formated){ + if(form.role === 'system'){ + if(form.memo === 'NewChatExample' || form.memo === 'NewChat'){ + resultString.push('[conversation: start]\n***') + } + else{ + resultString.push(form.content) + } + } + else if(form.name || form.role === 'assistant'){ + resultString.push((form.name ?? char) + ": " + form.content) + } + else if(form.role === 'user'){ + resultString.push(db.username + ": " + form.content) + } + else{ + resultString.push(form.content) + } + + } + return resultString.join('\n\n') + `\n\n${char}:` +} + +export interface NAISettings{ + topK: number + topP: number + topA: number + tailFreeSampling: number + repetitionPenalty: number + repetitionPenaltyRange: number + repetitionPenaltySlope: number + repostitionPenaltyPresence: number + seperator: string + frequencyPenalty: number + presencePenalty: number + typicalp:number +} + +export const NovelAIBadWordIds = [ + [60], + [62], + [544], + [683], + [696], + [880], + [905], + [1008], + [1019], + [1084], + [1092], + [1181], + [1184], + [1254], + [1447], + [1570], + [1656], + [2194], + [2470], + [2479], + [2498], + [2947], + [3138], + [3291], + [3455], + [3725], + [3851], + [3891], + [3921], + [3951], + [4207], + [4299], + [4622], + [4681], + [5013], + [5032], + [5180], + [5218], + [5290], + [5413], + [5456], + [5709], + [5749], + [5774], + [6038], + [6257], + [6334], + [6660], + [6904], + [7082], + [7086], + [7254], + [7444], + [7748], + [8001], + [8088], + [8168], + [8562], + [8605], + [8795], + [8850], + [9014], + [9102], + [9259], + [9318], + [9336], + [9502], + [9686], + [9793], + [9855], + [9899], + [9955], + [10148], + [10174], + [10943], + [11326], + [11337], + [11661], + [12004], + [12084], + [12159], + [12520], + [12977], + [13380], + [13488], + [13663], + [13811], + [13976], + [14412], + [14598], + [14767], + [15640], + [15707], + [15775], + [15830], + [16079], + [16354], + [16369], + [16445], + [16595], + [16614], + [16731], + [16943], + [17278], + [17281], + [17548], + [17555], + [17981], + [18022], + [18095], + [18297], + [18413], + [18736], + [18772], + [18990], + [19181], + [20095], + [20197], + [20481], + [20629], + [20871], + [20879], + [20924], + [20977], + [21375], + [21382], + [21391], + [21687], + [21810], + [21828], + [21938], + [22367], + [22372], + [22734], + [23405], + [23505], + [23734], + [23741], + [23781], + [24237], + [24254], + [24345], + [24430], + [25416], + [25896], + [26119], + [26635], + [26842], + [26991], + [26997], + [27075], + [27114], + [27468], + [27501], + [27618], + [27655], + [27720], + [27829], + [28052], + [28118], + [28231], + [28532], + [28571], + [28591], + [28653], + [29013], + [29547], + [29650], + [29925], + [30522], + [30537], + [30996], + [31011], + [31053], + [31096], + [31148], + [31258], + [31350], + [31379], + [31422], + [31789], + [31830], + [32214], + [32666], + [32871], + [33094], + [33376], + [33440], + [33805], + [34368], + [34398], + [34417], + [34418], + [34419], + [34476], + [34494], + [34607], + [34758], + [34761], + [34904], + [34993], + [35117], + [35138], + [35237], + [35487], + [35830], + [35869], + [36033], + [36134], + [36320], + [36399], + [36487], + [36586], + [36676], + [36692], + [36786], + [37077], + [37594], + [37596], + [37786], + [37982], + [38475], + [38791], + [39083], + [39258], + [39487], + [39822], + [40116], + [40125], + [41000], + [41018], + [41256], + [41305], + [41361], + [41447], + [41449], + [41512], + [41604], + [42041], + [42274], + [42368], + [42696], + [42767], + [42804], + [42854], + [42944], + [42989], + [43134], + [43144], + [43189], + [43521], + [43782], + [44082], + [44162], + [44270], + [44308], + [44479], + [44524], + [44965], + [45114], + [45301], + [45382], + [45443], + [45472], + [45488], + [45507], + [45564], + [45662], + [46265], + [46267], + [46275], + [46295], + [46462], + [46468], + [46576], + [46694], + [47093], + [47384], + [47389], + [47446], + [47552], + [47686], + [47744], + [47916], + [48064], + [48167], + [48392], + [48471], + [48664], + [48701], + [49021], + [49193], + [49236], + [49550], + [49694], + [49806], + [49824], + [50001], + [50256], + [0], + [1], + [3], + [49356], + [1431], + [31715], + [34387], + [20765], + [30702], + [10691], + [49333], + [1266], + [19438], + [43145], + [26523], + [41471], + [2936] +] \ No newline at end of file diff --git a/src/ts/process/request.ts b/src/ts/process/request.ts index 9377ec89..e9c38938 100644 --- a/src/ts/process/request.ts +++ b/src/ts/process/request.ts @@ -8,6 +8,7 @@ import { globalFetch, isNodeServer, isTauri } from "../storage/globalApi"; import { sleep } from "../util"; import { createDeep } from "./deepai"; import { hubURL } from "../characterCards"; +import { NovelAIBadWordIds, stringlizeNAIChat } from "./models/nai"; interface requestDataArgument{ formated: OpenAIChat[] @@ -317,28 +318,41 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model' } case 'novelai': case 'novelai_kayra':{ - const proompt = stringlizeChat(formated, currentChar?.name ?? '') - const params = { + const proompt = stringlizeNAIChat(formated, currentChar?.name ?? '') + + const gen = db.NAIsettings + const payload = { + temperature:temperature, + max_length: maxTokens, + min_length: 1, + top_k: gen.topK, + top_p: gen.topP, + top_a: gen.topA, + tail_free_sampling: gen.tailFreeSampling, + repetition_penalty: gen.repetitionPenalty, + repetition_penalty_range: gen.repetitionPenaltyRange, + repetition_penalty_slope: gen.repetitionPenaltySlope, + repetition_penalty_frequency: gen.frequencyPenalty, + repetition_penalty_presence: gen.presencePenalty, + generate_until_sentence: true, + use_cache: false, + use_string: true, + return_full_text: false, + prefix: 'vanilla', + order: [3,0], + bad_words_ids: NovelAIBadWordIds, + typical_p: gen.typicalp, + } + + + const body = { "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]} + "parameters":payload } const da = await globalFetch("https://api.novelai.net/ai/generate", { - body: params, + body: body, headers: { "Authorization": "Bearer " + db.novelai.token }, diff --git a/src/ts/process/templates/getRecomended.ts b/src/ts/process/templates/getRecomended.ts index 99b469ed..a6e2c5af 100644 --- a/src/ts/process/templates/getRecomended.ts +++ b/src/ts/process/templates/getRecomended.ts @@ -1,6 +1,6 @@ import { DataBase, setPreset, type botPreset, setDatabase } from "src/ts/storage/database"; import { get } from "svelte/store"; -import { prebuiltPresets } from "./templates"; +import { prebuiltNAIpresets, prebuiltPresets } from "./templates"; import { alertConfirm, alertSelect } from "src/ts/alert"; import { language } from "src/lang"; @@ -20,6 +20,17 @@ export async function setRecommended(model: string, ask:'ask'|'force') { const pr:botPreset = prebuiltPresets.OAI setDatabase(setPreset(db, pr)) } + else if(db.aiModel.startsWith('novelai')){ + const pr:botPreset = prebuiltPresets.OAI + pr.NAISettings = prebuiltNAIpresets + pr.temperature = 1.05 + pr.maxContext = 8000 + pr.maxResponse = 300 + pr.mainPrompt = "***\n[ Style: chat ]" + pr.jailbreak = '' + pr.globalNote = '' + setDatabase(setPreset(db, pr)) + } else if(db.aiModel === 'textgen_webui'){ const sel = parseInt(await alertSelect(["Llama, Alpaca", "Koala", "Vicuna", "WizardLM", "Others"])) let pr = prebuiltPresets.ooba @@ -60,5 +71,5 @@ export async function setRecommended(model: string, ask:'ask'|'force') { } export function recommendedPresetExist(model:string){ - return model.startsWith('gpt') || model === 'openrouter' || model === 'reverse_proxy' || model === 'textgen_webui' + return model.startsWith('gpt') || model === 'openrouter' || model === 'reverse_proxy' || model === 'textgen_webui' || model.startsWith('novelai') } \ No newline at end of file diff --git a/src/ts/process/templates/templates.ts b/src/ts/process/templates/templates.ts index 4b3e992e..caac6c51 100644 --- a/src/ts/process/templates/templates.ts +++ b/src/ts/process/templates/templates.ts @@ -1,4 +1,5 @@ import type { botPreset } from "../../storage/database"; +import type { NAISettings } from "../models/nai"; export const prebuiltPresets:{OAI:botPreset,ooba:botPreset} = { @@ -137,4 +138,20 @@ export const prebuiltPresets:{OAI:botPreset,ooba:botPreset} = { "top_k": 140 } } +} + + +export const prebuiltNAIpresets:NAISettings = { + topK: 12, + topP: 0.85, + topA: 0.1, + tailFreeSampling: 0.915, + repetitionPenalty: 2.8, + repetitionPenaltyRange: 2048, + repetitionPenaltySlope: 0.02, + repostitionPenaltyPresence: 0, + seperator: "", + frequencyPenalty: 0.03, + presencePenalty: 0, + typicalp: 1 } \ No newline at end of file diff --git a/src/ts/storage/database.ts b/src/ts/storage/database.ts index 36fd4bb3..1c76d9d9 100644 --- a/src/ts/storage/database.ts +++ b/src/ts/storage/database.ts @@ -7,6 +7,8 @@ import { downloadFile, saveAsset as saveImageGlobal } from './globalApi'; import { clone, cloneDeep } from 'lodash'; import { defaultAutoSuggestPrompt, defaultJailbreak, defaultMainPrompt } from './defaultPrompts'; import { alertNormal } from '../alert'; +import type { NAISettings } from '../process/models/nai'; +import { prebuiltNAIpresets } from '../process/templates/templates'; export const DataBase = writable({} as any as Database) export const loadedStore = writable(false) @@ -283,6 +285,7 @@ export function setDatabase(data:Database){ data.openrouterRequestModel ??= 'openai/gpt-3.5-turbo' data.toggleConfirmRecommendedPreset ??= true data.officialplugins ??= {} + data.NAIsettings ??= cloneDeep(prebuiltNAIpresets) data.assetWidth ??= -1 data.animationSpeed ??= 0.4 @@ -442,6 +445,7 @@ export interface botPreset{ ooba: OobaSettings ainconfig: AINsettings koboldURL?: string + NAISettings?: NAISettings } export interface Database{ @@ -586,6 +590,7 @@ export interface Database{ assetWidth:number animationSpeed:number botSettingAtStart:false + NAIsettings:NAISettings } interface hordeConfig{ @@ -828,7 +833,8 @@ export function saveCurrentPreset(){ ooba: cloneDeep(db.ooba), ainconfig: cloneDeep(db.ainconfig), proxyRequestModel: db.proxyRequestModel, - openrouterRequestModel: db.openrouterRequestModel + openrouterRequestModel: db.openrouterRequestModel, + NAISettings: cloneDeep(db.NAIsettings) } db.botPresets = pres setDatabase(db) @@ -882,6 +888,7 @@ export function setPreset(db:Database, newPres: botPreset){ db.ainconfig = cloneDeep(newPres.ainconfig ?? db.ainconfig) db.openrouterRequestModel = newPres.openrouterRequestModel ?? db.openrouterRequestModel db.proxyRequestModel = newPres.proxyRequestModel ?? db.proxyRequestModel + db.NAIsettings = newPres.NAISettings ?? db.NAIsettings return db }