diff --git a/src/lang/en.ts b/src/lang/en.ts index aeac7f88..452f46a0 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -167,6 +167,9 @@ export const languageEnglish = { chatHTML: "A HTML that would be inserted as each chat.\n\nYou can use CBS and special tags.\n- ``: a textbox that would be used to render text\n- ``: an icon for user or assistant\n- ``: icon buttons for chat edit, translations and etc.\n- ``: generation information button.", systemContentReplacement: "The prompt format that replaces system prompt if the model doesn't support system prompt.", systemRoleReplacement: "The role that replaces system role if the model doesn't support system role.", + summarizationPrompt: "The prompt that is used for summarization. if it is blank, it will use the default prompt. you can also use ChatML formating with {{slot}} for the chat data.", + translatorPrompt: "The prompt that is used for translation. if it is blank, it will use the default prompt. you can also use ChatML formating with {{slot}} for the dest language, {{solt::content}} for the content, and {{slot::tnote}} for the translator note.", + translateBeforeHTMLFormatting: "If enabled, it will translate the text before Regex scripts and HTML formatting. this could make the token lesser but could break the formatting.", }, setup: { chooseProvider: "Choose AI Provider", @@ -801,4 +804,9 @@ export const languageEnglish = { predictedOutput: "Predicted Output", systemContentReplacement: "System Content Replacement", systemRoleReplacement: "System Role Replacement", + seperateParameters: "Seperate Parameters", + seperateParametersEnabled: "Enable Seperate Parameters", + summarizationPrompt: "Summarization Prompt", + translatorPrompt: "Translation Prompt", + translateBeforeHTMLFormatting: "Translate Before HTML Formatting", } \ No newline at end of file diff --git a/src/lib/ChatScreens/Chat.svelte b/src/lib/ChatScreens/Chat.svelte index a29cd519..a4216761 100644 --- a/src/lib/ChatScreens/Chat.svelte +++ b/src/lib/ChatScreens/Chat.svelte @@ -148,7 +148,16 @@ } } if(translateText){ - if(!DBState.db.legacyTranslation){ + if(DBState.db.translator === 'llm' && DBState.db.translateBeforeHTMLFormatting){ + translating = true + data = await translateHTML(data, false, charArg, chatID) + translating = false + const marked = await ParseMarkdown(data, charArg, mode, chatID, getCbsCondition()) + lastParsedQueue = marked + lastCharArg = charArg + return marked + } + else if(!DBState.db.legacyTranslation){ const marked = await ParseMarkdown(data, charArg, 'pretranslate', chatID, getCbsCondition()) translating = true const translated = await postTranslationParse(await translateHTML(marked, false, charArg, chatID)) diff --git a/src/lib/Setting/Pages/BotSettings.svelte b/src/lib/Setting/Pages/BotSettings.svelte index 9db153c4..7e95cb12 100644 --- a/src/lib/Setting/Pages/BotSettings.svelte +++ b/src/lib/Setting/Pages/BotSettings.svelte @@ -27,7 +27,8 @@ import PromptSettings from "./PromptSettings.svelte"; import { openPresetList } from "src/ts/stores.svelte"; import { selectSingleFile } from "src/ts/util"; - import { LLMFormat } from "src/ts/model/modellist"; + import { getModelInfo, LLMFlags, LLMFormat, LLMProvider } from "src/ts/model/modellist"; + import CheckInput from "src/lib/UI/GUI/CheckInput.svelte"; let tokens = $state({ mainPrompt: 0, @@ -54,6 +55,8 @@ }); let submenu = $state(DBState.db.useLegacyGUI ? -1 : 0) + let modelInfo = $derived(getModelInfo(DBState.db.aiModel)) + let subModelInfo = $derived(getModelInfo(DBState.db.subModel))

{language.chatBot}

@@ -89,26 +92,21 @@ {language.submodel} - {#if DBState.db.aiModel.startsWith('palm2') || DBState.db.subModel.startsWith('palm2') || DBState.db.aiModel.startsWith('gemini') || DBState.db.subModel.startsWith('gemini')} - - {#if DBState.db.google.projectId === 'aigoogle'} - GoogleAI API Key - {:else} - Google Bearer Token - {/if} - + {#if modelInfo.provider === LLMProvider.GoogleCloud || subModelInfo.provider === LLMProvider.GoogleCloud} + GoogleAI API Key - - {#if DBState.db.google.projectId !== 'aigoogle'} - Google Project ID - - {/if} {/if} - {#if DBState.db.aiModel.startsWith('jamba') || DBState.db.subModel.startsWith('jamba')} + {#if modelInfo.provider === LLMProvider.VertexAI || subModelInfo.provider === LLMProvider.VertexAI} + Vertex Client Email + + Vertex Private Key + + {/if} + {#if modelInfo.provider === LLMProvider.AI21 || subModelInfo.provider === LLMProvider.AI21} AI21 {language.apiKey} {/if} - {#if DBState.db.aiModel.startsWith('novellist') || DBState.db.subModel.startsWith('novellist')} + {#if modelInfo.provider === LLMProvider.NovelList || subModelInfo.provider === LLMProvider.NovelList} NovelList {language.apiKey} {/if} @@ -116,15 +114,15 @@ Mancer {language.apiKey} {/if} - {#if DBState.db.aiModel.startsWith('claude-') || DBState.db.subModel.startsWith('claude-')} + {#if modelInfo.provider === LLMProvider.Anthropic || subModelInfo.provider === LLMProvider.Anthropic} Claude {language.apiKey} {/if} - {#if DBState.db.aiModel.startsWith('mistral') || DBState.db.subModel.startsWith('mistral')} + {#if modelInfo.provider === LLMProvider.Mistral || subModelInfo.provider === LLMProvider.Mistral} Mistral {language.apiKey} {/if} - {#if DBState.db.aiModel.startsWith('novelai') || DBState.db.subModel.startsWith('novelai')} + {#if modelInfo.provider === LLMProvider.NovelAI || subModelInfo.provider === LLMProvider.NovelAI} NovelAI Bearer Token {/if} @@ -156,11 +154,7 @@ {/if} - {#if DBState.db.aiModel.startsWith('risullm')} - Risu {language.apiKey} - - {/if} - {#if DBState.db.aiModel.startsWith('cohere')} + {#if modelInfo.provider === LLMProvider.Cohere || subModelInfo.provider === LLMProvider.Cohere} Cohere {language.apiKey} {/if} @@ -211,32 +205,21 @@ {/each} {/if} - {#if DBState.db.aiModel.startsWith('gpt') || DBState.db.subModel.startsWith('gpt') - || DBState.db.aiModel.startsWith('instructgpt') || DBState.db.subModel.startsWith('instructgpt')} + {#if modelInfo.provider === LLMProvider.OpenAI || subModelInfo.provider === LLMProvider.OpenAI} OpenAI {language.apiKey} {/if}
- {#if DBState.db.aiModel.startsWith('gpt') || DBState.db.aiModel === 'reverse_proxy' || DBState.db.aiModel === 'openrouter' || DBState.db.aiModel.startsWith('claude-3')} + {#if modelInfo.flags.includes(LLMFlags.hasStreaming) || subModelInfo.flags.includes(LLMFlags.hasStreaming)} {/if} - {#if DBState.db.aiModel.startsWith('palm2') || DBState.db.subModel.startsWith('palm2') || DBState.db.aiModel.startsWith('gemini') || DBState.db.subModel.startsWith('gemini')} - { - if(!v){ - DBState.db.google.projectId = 'aigoogle' - } - else{ - DBState.db.google.projectId = '' - } - }}/> - {/if} {#if DBState.db.aiModel === 'reverse_proxy' || DBState.db.subModel === 'reverse_proxy'} {/if} - {#if DBState.db.aiModel === "novelai" || DBState.db.subModel === "novelai" || DBState.db.aiModel === 'novelai_kayra' || DBState.db.subModel === 'novelai_kayra'} + {#if modelInfo.provider === LLMProvider.NovelAI || subModelInfo.provider === LLMProvider.NovelAI} @@ -299,25 +282,21 @@ {/if} {language.temperature} - - {#if DBState.db.aiModel.startsWith("novelai")} - - {:else} - - {/if} - {#if DBState.db.aiModel.startsWith('openrouter') || DBState.db.aiModel.startsWith('claude-3') || DBState.db.aiModel.startsWith('cohere-')|| DBState.db.aiModel === 'kobold'} + + {#if modelInfo.parameters.includes('top_k')} Top K {/if} - {#if DBState.db.aiModel.startsWith('openrouter')} + {#if modelInfo.parameters.includes('min_p')} Min P {/if} - {#if DBState.db.aiModel.startsWith('openrouter') || DBState.db.aiModel === 'kobold'} + {#if modelInfo.parameters.includes('top_a')} Top A - + {/if} + {#if modelInfo.parameters.includes('repetition_penalty')} Repetition penalty @@ -389,7 +368,7 @@
- {:else if DBState.db.aiModel.startsWith('novelai')} + {:else if modelInfo.format === LLMFormat.NovelAI}
Starter @@ -423,7 +402,7 @@ Cfg Scale - {:else if DBState.db.aiModel.startsWith('novellist')} + {:else if modelInfo.format === LLMFormat.NovelList} Top P Reputation Penalty @@ -438,22 +417,19 @@ Typical P - {:else if DBState.db.aiModel.startsWith('claude')} - Top P - - {:else if DBState.db.aiModel.startsWith('kobold')} - Top P - {:else} - - - Top P - - - {language.frequencyPenalty} - - {language.presensePenalty} - + {#if modelInfo.parameters.includes('top_p')} + Top P + + {/if} + {#if modelInfo.parameters.includes('frequency_penalty')} + {language.frequencyPenalty} + + {/if} + {#if modelInfo.parameters.includes('presence_penalty')} + {language.presensePenalty} + + {/if} {/if} {#if (DBState.db.reverseProxyOobaMode && DBState.db.aiModel === 'reverse_proxy') || (DBState.db.aiModel === 'ooba')} @@ -464,6 +440,41 @@ {/if} + + + {#if DBState.db.seperateParametersEnabled} + {#each Object.keys(DBState.db.seperateParameters) as param, i} + + {language.temperature} + + Top K + + Repetition penalty + + Min P + + Top A + + Top P + + Frequency Penalty + + Presence Penalty + + + {/each} + + {/if} + + {/if} {#if submenu === 3 || submenu === -1} diff --git a/src/lib/Setting/Pages/LanguageSettings.svelte b/src/lib/Setting/Pages/LanguageSettings.svelte index 97c70f26..182afb6a 100644 --- a/src/lib/Setting/Pages/LanguageSettings.svelte +++ b/src/lib/Setting/Pages/LanguageSettings.svelte @@ -115,6 +115,8 @@ {#if DBState.db.translatorType === 'llm'} {language.translationResponseSize} + {language.translatorPrompt} + {/if} @@ -149,4 +151,12 @@
+ + {#if DBState.db.translatorType === 'llm'} +
+ + + +
+ {/if} {/if} \ No newline at end of file diff --git a/src/lib/Setting/Pages/OtherBotSettings.svelte b/src/lib/Setting/Pages/OtherBotSettings.svelte index 598bda89..a6935c8e 100644 --- a/src/lib/Setting/Pages/OtherBotSettings.svelte +++ b/src/lib/Setting/Pages/OtherBotSettings.svelte @@ -15,6 +15,7 @@ import { getCharImage } from "src/ts/characters"; import Arcodion from "src/lib/UI/Arcodion.svelte"; import CheckInput from "src/lib/UI/GUI/CheckInput.svelte"; + import TextAreaInput from "src/lib/UI/GUI/TextAreaInput.svelte"; $effect.pre(() => { DBState.db.NAIImgConfig ??= { width: 512, @@ -423,8 +424,8 @@ {language.SuperMemory} OpenAI Key {/if} - {language.SuperMemory} Prompt - + {language.summarizationPrompt} + {language.HypaMemory} Model MiniLM-L6-v2 (Free / Local) diff --git a/src/lib/UI/GUI/SliderInput.svelte b/src/lib/UI/GUI/SliderInput.svelte index 3901521e..c41b74d0 100644 --- a/src/lib/UI/GUI/SliderInput.svelte +++ b/src/lib/UI/GUI/SliderInput.svelte @@ -13,7 +13,7 @@ {#if disableable}
- { + { onchange?.() if(c) { value = min; @@ -58,7 +58,7 @@ - {customText === undefined ? (value === -1000 ? language.disabled : (value * multiple).toFixed(fixed)) : customText} + {customText === undefined ? ((value === -1000 || value === undefined) ? language.disabled : (value * multiple).toFixed(fixed)) : customText}
diff --git a/src/ts/model/modellist.ts b/src/ts/model/modellist.ts index 616aba74..96dd5a58 100644 --- a/src/ts/model/modellist.ts +++ b/src/ts/model/modellist.ts @@ -9,6 +9,7 @@ export enum LLMFlags{ hasCache, hasFullSystemPrompt, hasFirstSystemPrompt, + hasStreaming, requiresAlternateRole, mustStartWithUserInput, } @@ -26,6 +27,7 @@ export enum LLMProvider{ WebLLM, Horde, AWS, + AI21 } export enum LLMFormat{ @@ -87,7 +89,7 @@ export const LLMModels: LLMModel[] = [ name: 'GPT-3.5', provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, - flags: [LLMFlags.hasFullSystemPrompt], + flags: [LLMFlags.hasFullSystemPrompt, LLMFlags.hasStreaming], parameters: OpenAIParameters, }, { @@ -96,7 +98,7 @@ export const LLMModels: LLMModel[] = [ name: 'InstructGPT-3.5', provider: LLMProvider.OpenAI, format: LLMFormat.OpenAILegacyInstruct, - flags: [LLMFlags.hasFullSystemPrompt], + flags: [LLMFlags.hasFullSystemPrompt, LLMFlags.hasStreaming], parameters: OpenAIParameters, }, { @@ -105,7 +107,7 @@ export const LLMModels: LLMModel[] = [ name: 'GPT-4 Turbo', provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, - flags: [LLMFlags.hasFullSystemPrompt], + flags: [LLMFlags.hasFullSystemPrompt, LLMFlags.hasStreaming], parameters: OpenAIParameters, }, { @@ -116,7 +118,8 @@ export const LLMModels: LLMModel[] = [ format: LLMFormat.OpenAICompatible, flags: [ LLMFlags.hasImageInput, - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], recommended: true, parameters: OpenAIParameters, @@ -129,7 +132,8 @@ export const LLMModels: LLMModel[] = [ format: LLMFormat.OpenAICompatible, flags: [ LLMFlags.hasImageInput, - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], recommended: true, parameters: OpenAIParameters, @@ -141,7 +145,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -152,7 +157,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -163,7 +169,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -174,7 +181,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -185,7 +193,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -196,7 +205,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -207,7 +217,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -218,7 +229,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -229,7 +241,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -240,7 +253,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -251,7 +265,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -262,7 +277,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -273,7 +289,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -283,7 +300,10 @@ export const LLMModels: LLMModel[] = [ name: 'GPT-4 Vision 1106', provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, - flags: [LLMFlags.hasImageInput], + flags: [ + LLMFlags.hasImageInput, + LLMFlags.hasStreaming + ], parameters: OpenAIParameters, }, { @@ -293,7 +313,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -305,7 +326,8 @@ export const LLMModels: LLMModel[] = [ format: LLMFormat.OpenAICompatible, flags: [ LLMFlags.hasImageInput, - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -317,7 +339,8 @@ export const LLMModels: LLMModel[] = [ format: LLMFormat.OpenAICompatible, flags: [ LLMFlags.hasImageInput, - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -329,7 +352,8 @@ export const LLMModels: LLMModel[] = [ format: LLMFormat.OpenAICompatible, flags: [ LLMFlags.hasImageInput, - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -341,7 +365,8 @@ export const LLMModels: LLMModel[] = [ format: LLMFormat.OpenAICompatible, flags: [ LLMFlags.hasImageInput, - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -352,7 +377,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -363,7 +389,8 @@ export const LLMModels: LLMModel[] = [ provider: LLMProvider.OpenAI, format: LLMFormat.OpenAICompatible, flags: [ - LLMFlags.hasFullSystemPrompt + LLMFlags.hasFullSystemPrompt, + LLMFlags.hasStreaming ], parameters: OpenAIParameters, }, @@ -376,7 +403,8 @@ export const LLMModels: LLMModel[] = [ flags: [ LLMFlags.hasPrefill, LLMFlags.hasImageInput, - LLMFlags.hasFirstSystemPrompt + LLMFlags.hasFirstSystemPrompt, + LLMFlags.hasStreaming ], recommended: true, parameters: ClaudeParameters, @@ -390,7 +418,8 @@ export const LLMModels: LLMModel[] = [ flags: [ LLMFlags.hasPrefill, LLMFlags.hasImageInput, - LLMFlags.hasFirstSystemPrompt + LLMFlags.hasFirstSystemPrompt, + LLMFlags.hasStreaming ], recommended: true, parameters: ClaudeParameters, @@ -404,7 +433,8 @@ export const LLMModels: LLMModel[] = [ flags: [ LLMFlags.hasPrefill, LLMFlags.hasImageInput, - LLMFlags.hasFirstSystemPrompt + LLMFlags.hasFirstSystemPrompt, + LLMFlags.hasStreaming ], parameters: ClaudeParameters, }, @@ -417,7 +447,8 @@ export const LLMModels: LLMModel[] = [ flags: [ LLMFlags.hasPrefill, LLMFlags.hasImageInput, - LLMFlags.hasFirstSystemPrompt + LLMFlags.hasFirstSystemPrompt, + LLMFlags.hasStreaming ], parameters: ClaudeParameters, }, @@ -430,7 +461,8 @@ export const LLMModels: LLMModel[] = [ flags: [ LLMFlags.hasPrefill, LLMFlags.hasImageInput, - LLMFlags.hasFirstSystemPrompt + LLMFlags.hasFirstSystemPrompt, + LLMFlags.hasStreaming ], parameters: ClaudeParameters, }, @@ -443,7 +475,8 @@ export const LLMModels: LLMModel[] = [ flags: [ LLMFlags.hasPrefill, LLMFlags.hasImageInput, - LLMFlags.hasFirstSystemPrompt + LLMFlags.hasFirstSystemPrompt, + LLMFlags.hasStreaming ], parameters: ClaudeParameters, }, @@ -456,7 +489,8 @@ export const LLMModels: LLMModel[] = [ flags: [ LLMFlags.hasPrefill, LLMFlags.hasImageInput, - LLMFlags.hasFirstSystemPrompt + LLMFlags.hasFirstSystemPrompt, + LLMFlags.hasStreaming ], parameters: ClaudeParameters, }, @@ -469,7 +503,8 @@ export const LLMModels: LLMModel[] = [ flags: [ LLMFlags.hasPrefill, LLMFlags.hasImageInput, - LLMFlags.hasFirstSystemPrompt + LLMFlags.hasFirstSystemPrompt, + LLMFlags.hasStreaming ], parameters: ClaudeParameters, }, @@ -593,7 +628,7 @@ export const LLMModels: LLMModel[] = [ id: 'openrouter', provider: LLMProvider.AsIs, format: LLMFormat.OpenAICompatible, - flags: [LLMFlags.hasFullSystemPrompt, LLMFlags.hasImageInput], + flags: [LLMFlags.hasFullSystemPrompt, LLMFlags.hasImageInput, LLMFlags.hasStreaming], parameters: ['temperature', 'top_p', 'frequency_penalty', 'presence_penalty', 'repetition_penalty', 'min_p', 'top_a', 'top_k'], recommended: true }, @@ -930,7 +965,7 @@ export const LLMModels: LLMModel[] = [ name: "Custom API", provider: LLMProvider.AsIs, format: LLMFormat.OpenAICompatible, - flags: [LLMFlags.hasFullSystemPrompt], + flags: [LLMFlags.hasFullSystemPrompt, LLMFlags.hasStreaming], recommended: true, parameters: ['temperature', 'top_p', 'frequency_penalty', 'presence_penalty', 'repetition_penalty', 'min_p', 'top_a', 'top_k'] } diff --git a/src/ts/process/index.svelte.ts b/src/ts/process/index.svelte.ts index 74f067ba..47dcfd44 100644 --- a/src/ts/process/index.svelte.ts +++ b/src/ts/process/index.svelte.ts @@ -1465,9 +1465,8 @@ export async function sendChat(chatProcessIndex = -1,arg:{ formated: promptbody, bias: emobias, currentChar: currentChar, - temperature: 0.4, maxTokens: 30, - }, 'submodel', abortSignal) + }, 'emotion', abortSignal) if(rq.type === 'fail' || rq.type === 'streaming' || rq.type === 'multiline'){ if(abortSignal.aborted){ diff --git a/src/ts/process/memory/hypav2.ts b/src/ts/process/memory/hypav2.ts index a0758b9b..ba68e160 100644 --- a/src/ts/process/memory/hypav2.ts +++ b/src/ts/process/memory/hypav2.ts @@ -5,6 +5,7 @@ import { requestChatData } from "../request"; import { HypaProcesser } from "./hypamemory"; import { globalFetch } from "src/ts/globalApi.svelte"; import { runSummarizer } from "../transformers"; +import { parseChatML } from "src/ts/parser.svelte"; export interface HypaV2Data { chunks: { @@ -83,7 +84,10 @@ async function summary(stringlizedChat: string): Promise<{ success: boolean; dat }; } } else { - const promptbody: OpenAIChat[] = [ + + let parsedPrompt = parseChatML(supaPrompt.replaceAll('{{slot}}', stringlizedChat)) + + const promptbody: OpenAIChat[] = parsedPrompt ?? [ { role: "user", content: stringlizedChat @@ -99,7 +103,7 @@ async function summary(stringlizedChat: string): Promise<{ success: boolean; dat bias: {}, useStreaming: false, noMultiGen: true - }, 'submodel'); + }, 'memory'); if (da.type === 'fail' || da.type === 'streaming' || da.type === 'multiline') { return { success: false, diff --git a/src/ts/process/memory/supaMemory.ts b/src/ts/process/memory/supaMemory.ts index 189358c4..ffa507ec 100644 --- a/src/ts/process/memory/supaMemory.ts +++ b/src/ts/process/memory/supaMemory.ts @@ -7,6 +7,7 @@ import { stringlizeChat } from "../stringlize"; import { globalFetch } from "src/ts/globalApi.svelte"; import { runSummarizer } from "../transformers"; import { getUserName } from "src/ts/util"; +import { parseChatML } from "src/ts/parser.svelte"; export async function supaMemory( chats:OpenAIChat[], @@ -252,7 +253,8 @@ export async function supaMemory( } } else { - const promptbody:OpenAIChat[] = [ + let parsedPrompt = parseChatML(supaPrompt.replaceAll('{{slot}}', stringlizedChat)) + const promptbody:OpenAIChat[] = parsedPrompt ?? [ { role: "user", content: stringlizedChat @@ -267,7 +269,7 @@ export async function supaMemory( bias: {}, useStreaming: false, noMultiGen: true - }, 'submodel') + }, 'memory') if(da.type === 'fail' || da.type === 'streaming' || da.type === 'multiline'){ return { currentTokens: currentTokens, diff --git a/src/ts/process/request.ts b/src/ts/process/request.ts index dfc3f9a1..a4d8432f 100644 --- a/src/ts/process/request.ts +++ b/src/ts/process/request.ts @@ -1,5 +1,5 @@ import type { MultiModal, OpenAIChat, OpenAIChatFull } from "./index.svelte"; -import { getCurrentCharacter, getDatabase, type character } from "../storage/database.svelte"; +import { getCurrentCharacter, getDatabase, setDatabase, type character } from "../storage/database.svelte"; import { pluginProcess } from "../plugins/plugins"; import { language } from "../../lang"; import { stringlizeAINChat, getStopStrings, unstringlizeAIN, unstringlizeChat } from "./stringlize"; @@ -47,6 +47,7 @@ interface RequestDataArgumentExtended extends requestDataArgument{ abortSignal?:AbortSignal modelInfo?:LLMModel customURL?:string + mode?:ModelModeExtended } type requestDataResponse = { @@ -89,12 +90,31 @@ interface OaiFunctions { export type Parameter = 'temperature'|'top_k'|'repetition_penalty'|'min_p'|'top_a'|'top_p'|'frequency_penalty'|'presence_penalty' +export type ModelModeExtended = 'model'|'submodel'|'memory'|'emotion'|'otherAx'|'translate' type ParameterMap = { [key in Parameter]?: string; }; -function applyParameters(data: { [key: string]: any }, parameters: Parameter[], rename: ParameterMap = {}) { +function applyParameters(data: { [key: string]: any }, parameters: Parameter[], rename: ParameterMap, ModelMode:ModelModeExtended): { [key: string]: any } { const db = getDatabase() + if(db.seperateParametersEnabled && ModelMode !== 'model'){ + if(ModelMode === 'submodel'){ + ModelMode = 'otherAx' + } + + for(const parameter of parameters){ + let value = db.seperateParameters[ModelMode][parameter] + + if(value === -1000 || value === undefined){ + continue + } + + data[rename[parameter] ?? parameter] = value + } + return data + } + + for(const parameter of parameters){ let value = 0 switch(parameter){ @@ -141,7 +161,7 @@ function applyParameters(data: { [key: string]: any }, parameters: Parameter[], return data } -export async function requestChatData(arg:requestDataArgument, model:'model'|'submodel', abortSignal:AbortSignal=null):Promise { +export async function requestChatData(arg:requestDataArgument, model:ModelModeExtended, abortSignal:AbortSignal=null):Promise { const db = getDatabase() let trys = 0 while(true){ @@ -240,7 +260,7 @@ function reformater(formated:OpenAIChat[],modelInfo:LLMModel){ } -export async function requestChatDataMain(arg:requestDataArgument, model:'model'|'submodel', abortSignal:AbortSignal=null):Promise { +export async function requestChatDataMain(arg:requestDataArgument, model:ModelModeExtended, abortSignal:AbortSignal=null):Promise { const db = getDatabase() const targ:RequestDataArgumentExtended = arg targ.formated = safeStructuredClone(arg.formated) @@ -255,6 +275,7 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model' targ.multiGen = ((db.genTime > 1 && targ.aiModel.startsWith('gpt') && (!arg.continue)) && (!arg.noMultiGen)) targ.abortSignal = abortSignal targ.modelInfo = getModelInfo(targ.aiModel) + targ.mode = model if(targ.aiModel === 'reverse_proxy'){ targ.modelInfo.internalID = db.customProxyRequestModel targ.modelInfo.format = db.customAPIFormat @@ -502,7 +523,7 @@ async function requestOpenAI(arg:RequestDataArgumentExtended):Promise() -async function translateLLM(text:string, arg:{to:string}){ - if(llmCache.has(text)){ - return llmCache.get(text) +async function translateLLM(text:string, arg:{to:string}):Promise{ + const cacheMatch = await LLMCacheStorage.getItem(text) + if(cacheMatch){ + return cacheMatch as string } const styleDecodeRegex = /\(.+?)\<\/risu-style\>/gms let styleDecodes:string[] = [] @@ -489,7 +494,7 @@ async function translateLLM(text:string, arg:{to:string}){ useStreaming: false, noMultiGen: true, maxTokens: db.translatorMaxResponse, - }, 'submodel') + }, 'translate') if(rq.type === 'fail' || rq.type === 'streaming' || rq.type === 'multiline'){ alertError(`${rq.result}`) @@ -498,6 +503,6 @@ async function translateLLM(text:string, arg:{to:string}){ const result = rq.result.replace(//g, (match, p1) => { return styleDecodes[parseInt(p1)] ?? '' }).replace(/<\/style-data>/g, '') - llmCache.set(text, result) + await LLMCacheStorage.setItem(text, result) return result } \ No newline at end of file