Merge branch 'kwaroran:main' into main

This commit is contained in:
HyperBlaze
2024-12-01 05:35:23 -08:00
committed by GitHub
9 changed files with 307 additions and 140 deletions

View File

@@ -411,7 +411,7 @@ export async function ParseMarkdown(
if(firstParsed !== data && char && char.type !== 'group'){
data = await parseAdditionalAssets(data, char, additionalAssetMode, 'post')
}
data = await parseInlayImages(data)
data = await parseInlayImages(data ?? '')
data = encodeStyle(data)
if(mode === 'normal'){
@@ -720,7 +720,7 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string
if(achara.type === 'group'){
return ""
}
return achara.personality
return risuChatParser(achara.personality, matcherArg)
}
case 'description':
case 'char_desc':{
@@ -729,7 +729,7 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string
if(achara.type === 'group'){
return ""
}
return achara.desc
return risuChatParser(achara.desc, matcherArg)
}
case 'scenario':{
const argChara = chara
@@ -737,7 +737,7 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string
if(achara.type === 'group'){
return ""
}
return achara.scenario
return risuChatParser(achara.scenario, matcherArg)
}
case 'example_dialogue':
case 'example_message':{
@@ -746,15 +746,15 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string
if(achara.type === 'group'){
return ""
}
return achara.exampleMessage
return risuChatParser(achara.exampleMessage, matcherArg)
}
case 'persona':
case 'user_persona':{
return getPersonaPrompt()
return risuChatParser(getPersonaPrompt(), matcherArg)
}
case 'main_prompt':
case 'system_prompt':{
return db.mainPrompt
return risuChatParser(db.mainPrompt, matcherArg)
}
case 'lorebook':
case 'world_info':{
@@ -765,49 +765,56 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string
const characterLore = (achara.type === 'group') ? [] : (achara.globalLore ?? [])
const chatLore = chat.localLore ?? []
const fullLore = characterLore.concat(chatLore.concat(getModuleLorebooks()))
return fullLore.map((f) => {
return JSON.stringify(f)
}).join("§\n")
return makeArray(fullLore.map((v) => {
return JSON.stringify(v)
}))
}
case 'history':
case 'messages':{
const selchar = db.characters[get(selectedCharID)]
const chat = selchar.chats[selchar.chatPage]
return chat.message.map((f) => {
return f.role + ': ' + f.data
}).join("§\n")
return makeArray([{
role: 'char',
data: chat.fmIndex === -1 ? selchar.firstMessage : selchar.alternateGreetings[chat.fmIndex]
}].concat(chat.message).map((v) => {
v = safeStructuredClone(v)
v.data = risuChatParser(v.data, matcherArg)
return JSON.stringify(v)
}))
}
case 'user_history':
case 'user_messages':{
const selchar = db.characters[get(selectedCharID)]
const chat = selchar.chats[selchar.chatPage]
return chat.message.map((f) => {
if(f.role === 'user'){
return f.data
}
return ''
}).filter((f) => {
return f !== ''
}).join("§\n")
return makeArray(chat.message.filter((v) => {
return v.role === 'user'
}).map((v) => {
v = safeStructuredClone(v)
v.data = risuChatParser(v.data, matcherArg)
return JSON.stringify(v)
}))
}
case 'char_history':
case 'char_messages':{
const selchar = db.characters[get(selectedCharID)]
const chat = selchar.chats[selchar.chatPage]
return chat.message.map((f) => {
if(f.role === 'char'){
return f.data
}
return ''
}).filter((f) => {
return f !== ''
}).join("§\n")
return makeArray(chat.message.filter((v) => {
return v.role === 'char'
}).map((v) => {
v = safeStructuredClone(v)
v.data = risuChatParser(v.data, matcherArg)
return JSON.stringify(v)
}))
}
case 'jb':
case 'jailbreak':{
return risuChatParser(db.jailbreak, matcherArg)
}
case 'ujb':
case 'global_note':
case 'system_note':{
return db.globalNote
return risuChatParser(db.globalNote, matcherArg)
}
case 'chat_index':{
return chatID.toString()
@@ -1038,9 +1045,9 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string
if(!selchar || selchar.type === 'group'){
return ''
}
return selchar.additionalAssets?.map((f) => {
return makeArray(selchar.additionalAssets?.map((f) => {
return f[0]
})?.join('§') ?? ''
}))
}
case 'prefill_supported':{
return db.aiModel.startsWith('claude') ? '1' : '0'
@@ -1286,7 +1293,9 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string
}
case 'arraypush':
case 'array_push':{
return arra[1] + '§' + arra[2]
const arr = parseArray(arra[1])
arr.push(arra[2])
return makeArray(arr)
}
case 'arraysplice':
case 'array_splice':{
@@ -1351,14 +1360,13 @@ function basicMatcher (p1:string,matcherArg:matcherArg,vars:{[key:string]:string
const start = arr.length > 1 ? Number(arr[0]) : 0
const end = arr.length > 1 ? Number(arr[1]) : Number(arr[0])
const step = arr.length > 2 ? Number(arr[2]) : 1
let out = ''
let out:string[] = []
for(let i=start;i<end;i+=step){
out += i.toString()
if(i + step < end){
out += '§'
}
out.push(i.toString())
}
return out
return makeArray(out)
}
case 'date':
case 'time':
@@ -1727,7 +1735,11 @@ function blockStartMatcher(p1:string,matcherArg:matcherArg):{type:blockMatch,typ
return {type:'pure-display'}
}
if(p1.startsWith('#each')){
return {type:'each',type2:p1.substring(5).trim()}
let t2 = p1.substring(5).trim()
if(t2.startsWith('as ')){
t2 = t2.substring(3).trim()
}
return {type:'each',type2:t2}
}
if(p1.startsWith('#func')){
const statement = p1.split(' ')
@@ -1831,6 +1843,12 @@ export function risuChatParser(da:string, arg:{
arg:string[]
}> = arg.functions ?? (new Map())
arg.callStack = (arg.callStack ?? 0) + 1
if(arg.callStack > 20){
return 'ERROR: Call stack limit reached'
}
const matcherObj = {
chatID: chatID,
chara: chara,
@@ -1842,7 +1860,8 @@ export function risuChatParser(da:string, arg:{
role: arg.role,
runVar: arg.runVar ?? false,
consistantChar: arg.consistantChar ?? false,
cbsConditions: arg.cbsConditions ?? {}
cbsConditions: arg.cbsConditions ?? {},
callStack: arg.callStack,
}
@@ -1971,7 +1990,7 @@ export function risuChatParser(da:string, arg:{
}
}
if(dat.startsWith('call::')){
if(arg.callStack && arg.callStack > 10){
if(arg.callStack && arg.callStack > 20){
nested[0] += `ERROR: Call stack limit reached`
break
}
@@ -1985,7 +2004,6 @@ export function risuChatParser(da:string, arg:{
data = data.replaceAll(`{{arg::${i}}}`, argData[i])
}
arg.functions = functions
arg.callStack = (arg.callStack ?? 0) + 1
nested[0] += risuChatParser(data, arg)
break
}
@@ -2280,7 +2298,7 @@ export function parseChatML(data:string):OpenAIChat[]|null{
return {
role: role,
content: v
content: risuChatParser(v)
}
})
}

View File

@@ -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

View File

@@ -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){

View File

@@ -12,7 +12,7 @@ import { defaultColorScheme, type ColorScheme } from '../gui/colorscheme';
import type { PromptItem, PromptSettings } from '../process/prompt';
import type { OobaChatCompletionRequestParams } from '../model/ooba';
export let appVer = "140.1.0"
export let appVer = "141.0.0"
export let webAppSubVer = ''

View File

@@ -111,7 +111,7 @@ export async function runTranslator(text:string, reverse:boolean, from:string,ta
async function translateMain(text:string, arg:{from:string, to:string, host:string}){
let db = getDatabase()
if(db.translatorType === 'llm'){
const tr = db.translator || 'en'
const tr = arg.to || 'en'
return translateLLM(text, {to: tr})
}
if(db.translatorType === 'deepl'){