From 8a6cfedcda49601cc529b7dbee0b0319dd79f287 Mon Sep 17 00:00:00 2001 From: kwaroran Date: Sun, 1 Dec 2024 17:05:50 +0900 Subject: [PATCH] Add ChatML and Rework display --- src/lib/UI/PromptDataItem.svelte | 293 ++++++++++++++++++++++--------- src/ts/parser.svelte.ts | 2 +- src/ts/process/index.svelte.ts | 11 ++ src/ts/process/prompt.ts | 14 +- 4 files changed, 234 insertions(+), 86 deletions(-) diff --git a/src/lib/UI/PromptDataItem.svelte b/src/lib/UI/PromptDataItem.svelte index 2a270abb..ec7c1f3c 100644 --- a/src/lib/UI/PromptDataItem.svelte +++ b/src/lib/UI/PromptDataItem.svelte @@ -10,6 +10,7 @@ import TextInput from "./GUI/TextInput.svelte"; import { DBState } from 'src/ts/stores.svelte'; + let opened = $state(false) interface Props { promptItem: PromptItem; onRemove?: () => void; @@ -36,101 +37,227 @@ promptItem = currentprompt } - + function getName(promptItem:PromptItem){ -
- - - - - - {language.type} - - { - if(promptItem.type === 'plain' || promptItem.type === 'jailbreak' || promptItem.type === 'cot'){ - promptItem.text = "" - promptItem.role = "system" + if(promptItem.name){ + return promptItem.name + } + + if(promptItem.type === 'plain'){ + return language.formating.plain + } + if(promptItem.type === 'jailbreak'){ + return language.formating.jailbreak } if(promptItem.type === 'chat'){ - promptItem.rangeStart = -1000 - promptItem.rangeEnd = 'end' + return language.Chat } - }} > - {language.formating.plain} - {language.formating.jailbreak} - {language.Chat} - {language.formating.personaPrompt} - {language.formating.description} - {language.formating.authorNote} - {language.formating.lorebook} - {language.formating.memory} - {language.formating.postEverything} - {#if DBState.db.promptSettings.customChainOfThought} - {language.cot} - {/if} - + if(promptItem.type === 'persona'){ + return language.formating.personaPrompt + } + if(promptItem.type === 'description'){ + return language.formating.description + } + if(promptItem.type === 'authornote'){ + return language.formating.authorNote + } + if(promptItem.type === 'lorebook'){ + return language.formating.lorebook + } + if(promptItem.type === 'memory'){ + return language.formating.memory + } + if(promptItem.type === 'postEverything'){ + return language.formating.postEverything + } + if(promptItem.type === 'cot'){ + return language.cot + } + if(promptItem.type === 'chatML'){ + return 'ChatML' + } + return "" + } - {#if promptItem.type === 'plain' || promptItem.type === 'jailbreak' || promptItem.type === 'cot'} - {language.specialType} - - {language.noSpecialType} - {language.mainPrompt} - {language.globalNote} + function replacePrompt(prompt:PromptItem){ + if(JSON.stringify(promptItem) === JSON.stringify(prompt)){ + return + } + + const ind = DBState.db.promptTemplate.findIndex((item, index) => { + return JSON.stringify(item) === JSON.stringify(prompt) + }) + + if(ind !== -1){ + DBState.db.promptTemplate[ind] = promptItem + promptItem = prompt + } + else{ + const myInd = DBState.db.promptTemplate.findIndex((item, index) => { + return JSON.stringify(item) === JSON.stringify(promptItem) + }) + DBState.db.promptTemplate.splice(myInd, 0, prompt) + } + + } + + + +
{ + e.preventDefault() + e.stopPropagation() + const data = e.dataTransfer.getData('text') + if(data === 'prompt'){ + const prompt = JSON.parse(e.dataTransfer.getData('prompt')) + replacePrompt(prompt) + } +}} ondragover={(e) => { + e.preventDefault() +}} draggable="true" ondragstart={(e) => { + e.dataTransfer.setData('text', 'prompt') + e.dataTransfer.setData('prompt', JSON.stringify(promptItem)) +}}> + +
+ +
{ + e.preventDefault() + }} + ondrop={(e) => { + e.preventDefault() + const data = e.dataTransfer.getData('text') + if(data === 'prompt'){ + const prompt = JSON.parse(e.dataTransfer.getData('prompt')) + replacePrompt(prompt) + } + }} + draggable={opened ? false : true} + ondragstart={(e) => { + e.dataTransfer.setData('text', 'prompt') + e.dataTransfer.setData('prompt', JSON.stringify(promptItem)) + }} +> + +
{ + opened = !opened + }}> + {getName(promptItem)} +
+ + + +
+
+ {#if opened} + + + {language.name} + + {language.type} + { + if(promptItem.type === 'plain' || promptItem.type === 'jailbreak' || promptItem.type === 'cot'){ + promptItem.text = "" + promptItem.role = "system" + } + if(promptItem.type === 'chat'){ + promptItem.rangeStart = -1000 + promptItem.rangeEnd = 'end' + } + }} > + {language.formating.plain} + {language.formating.jailbreak} + {language.Chat} + {language.formating.personaPrompt} + {language.formating.description} + {language.formating.authorNote} + {language.formating.lorebook} + {language.formating.memory} + {language.formating.postEverything} + {"chatML"} + + {#if DBState.db.promptSettings.customChainOfThought} + {language.cot} + {/if} - {language.prompt} - - {language.role} - - {language.user} - {language.character} - {language.systemPrompt} - - {/if} - {#if promptItem.type === 'chat'} - {#if promptItem.rangeStart !== -1000} - {language.rangeStart} - - {language.rangeEnd} - {#if promptItem.rangeEnd === 'end'} - - { - if(promptItem.type === 'chat'){ - promptItem.rangeEnd = 0 + + {#if promptItem.type === 'plain' || promptItem.type === 'jailbreak' || promptItem.type === 'cot'} + {language.specialType} + + {language.noSpecialType} + {language.mainPrompt} + {language.globalNote} + + {language.prompt} + + {language.role} + + {language.user} + {language.character} + {language.systemPrompt} + + {/if} + {#if promptItem.type === 'chatML'} + {language.prompt} + + {/if} + {#if promptItem.type === 'chat'} + {#if promptItem.rangeStart !== -1000} + {language.rangeStart} + + {language.rangeEnd} + {#if promptItem.rangeEnd === 'end'} + + { + if(promptItem.type === 'chat'){ + promptItem.rangeEnd = 0 + } + }} /> + {:else} + + { + if(promptItem.type === 'chat'){ + promptItem.rangeEnd = 'end' + } + }} /> + {/if} + {#if DBState.db.promptSettings.sendChatAsSystem} + + {/if} + {/if} + + {/if} + {#if promptItem.type === 'authornote'} + {language.defaultPrompt} + + {/if} + {#if promptItem.type === 'persona' || promptItem.type === 'description' || promptItem.type === 'authornote' || promptItem.type === 'memory'} + {#if !promptItem.innerFormat} + { + if(promptItem.type === 'persona' || promptItem.type === 'description' || promptItem.type === 'authornote' || promptItem.type === 'memory'){ + promptItem.innerFormat = "{{slot}}" } }} /> {:else} - - { - if(promptItem.type === 'chat'){ - promptItem.rangeEnd = 'end' + {language.innerFormat} + + { + if(promptItem.type === 'persona' || promptItem.type === 'description' || promptItem.type === 'authornote' || promptItem.type === 'memory'){ + promptItem.innerFormat = null } }} /> {/if} - {#if DBState.db.promptSettings.sendChatAsSystem} - - {/if} - {/if} - - {/if} - {#if promptItem.type === 'authornote'} - {language.defaultPrompt} - - {/if} - {#if promptItem.type === 'persona' || promptItem.type === 'description' || promptItem.type === 'authornote' || promptItem.type === 'memory'} - {#if !promptItem.innerFormat} - { - if(promptItem.type === 'persona' || promptItem.type === 'description' || promptItem.type === 'authornote' || promptItem.type === 'memory'){ - promptItem.innerFormat = "{{slot}}" - } - }} /> - {:else} - {language.innerFormat} - - { - if(promptItem.type === 'persona' || promptItem.type === 'description' || promptItem.type === 'authornote' || promptItem.type === 'memory'){ - promptItem.innerFormat = null - } - }} /> {/if} {/if}
\ No newline at end of file diff --git a/src/ts/parser.svelte.ts b/src/ts/parser.svelte.ts index 82ec755e..d356d92e 100644 --- a/src/ts/parser.svelte.ts +++ b/src/ts/parser.svelte.ts @@ -2280,7 +2280,7 @@ export function parseChatML(data:string):OpenAIChat[]|null{ return { role: role, - content: v + content: risuChatParser(v) } }) } diff --git a/src/ts/process/index.svelte.ts b/src/ts/process/index.svelte.ts index 47dcfd44..b6f73e64 100644 --- a/src/ts/process/index.svelte.ts +++ b/src/ts/process/index.svelte.ts @@ -28,6 +28,7 @@ import { runImageEmbedding } from "./transformers"; import { hanuraiMemory } from "./memory/hanuraiMemory"; import { hypaMemoryV2 } from "./memory/hypav2"; import { runLuaEditTrigger } from "./lua"; +import { parseChatML } from "../parser.svelte"; export interface OpenAIChat{ role: 'system'|'user'|'assistant'|'function' @@ -548,6 +549,11 @@ export async function sendChat(chatProcessIndex = -1,arg:{ await tokenizeChatArray([prompt]) break } + case 'chatML':{ + let prompts = parseChatML(card.text) + await tokenizeChatArray(prompts) + break + } case 'chat':{ let start = card.rangeStart let end = (card.rangeEnd === 'end') ? unformated.chats.length : card.rangeEnd @@ -1007,6 +1013,11 @@ export async function sendChat(chatProcessIndex = -1,arg:{ pushPrompts([prompt]) break } + case 'chatML':{ + let prompts = parseChatML(card.text) + pushPrompts(prompts) + break + } case 'chat':{ let start = card.rangeStart let end = (card.rangeEnd === 'end') ? unformated.chats.length : card.rangeEnd diff --git a/src/ts/process/prompt.ts b/src/ts/process/prompt.ts index a5e764f1..89c49dd2 100644 --- a/src/ts/process/prompt.ts +++ b/src/ts/process/prompt.ts @@ -4,7 +4,7 @@ import { getDatabase, presetTemplate, setDatabase, type Database } from "../stor import { alertError, alertNormal } from "../alert"; import type { OobaChatCompletionRequestParams } from "../model/ooba"; -export type PromptItem = PromptItemPlain|PromptItemTyped|PromptItemChat|PromptItemAuthorNote; +export type PromptItem = PromptItemPlain|PromptItemTyped|PromptItemChat|PromptItemAuthorNote|PromptItemChatML export type PromptType = PromptItem['type']; export type PromptSettings = { assistantPrefill: string @@ -21,17 +21,26 @@ export interface PromptItemPlain { type2: 'normal'|'globalNote'|'main' text: string; role: 'user'|'bot'|'system'; + name?: string +} + +export interface PromptItemChatML { + type: 'chatML' + text: string + name?: string } export interface PromptItemTyped { type: 'persona'|'description'|'lorebook'|'postEverything'|'memory' - innerFormat?: string + innerFormat?: string, + name?: string } export interface PromptItemAuthorNote { type : 'authornote' innerFormat?: string defaultText?: string + name?: string } @@ -40,6 +49,7 @@ export interface PromptItemChat { rangeStart: number; rangeEnd: number|'end'; chatAsOriginalOnSystem?: boolean; + name?: string } export async function tokenizePreset(prompts:PromptItem[], consti:boolean = false){