From 8a7ad5ef9164e50f8ecbdb3ccb13449dffcb9fb5 Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Sun, 24 Mar 2024 02:19:10 +0200 Subject: [PATCH] Indicate overridden prompts --- public/css/promptmanager.css | 7 +++++++ public/scripts/PromptManager.js | 17 ++++++++++++++--- public/scripts/openai.js | 20 +++++++++++++++++--- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/public/css/promptmanager.css b/public/css/promptmanager.css index 89e11dbff..6cf4dd0d0 100644 --- a/public/css/promptmanager.css +++ b/public/css/promptmanager.css @@ -241,6 +241,13 @@ font-weight: 600; } +#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt .completion_prompt_manager_prompt_name .fa-solid.prompt-manager-overridden { + margin-left: 5px; + color: var(--SmartThemeQuoteColor); + cursor: pointer; + opacity: 0.8; +} + #completion_prompt_manager_footer_append_prompt { font-size: 16px; } diff --git a/public/scripts/PromptManager.js b/public/scripts/PromptManager.js index 30e128d46..bf73b7265 100644 --- a/public/scripts/PromptManager.js +++ b/public/scripts/PromptManager.js @@ -104,6 +104,7 @@ class Prompt { */ class PromptCollection { collection = []; + overriddenPrompts = []; /** * Create a new PromptCollection instance. @@ -178,6 +179,11 @@ class PromptCollection { has(identifier) { return this.index(identifier) !== -1; } + + override(prompt, position) { + this.set(prompt, position); + this.overriddenPrompts.push(prompt.identifier); + } } class PromptManager { @@ -194,6 +200,8 @@ class PromptManager { 'jailbreak', ]; + this.overriddenPrompts = []; + this.configuration = { version: 1, prefix: '', @@ -1290,7 +1298,7 @@ class PromptManager { /** * Setter for messages property * - * @param {MessageCollection} messages + * @param {import('./openai.js').MessageCollection} messages */ setMessages(messages) { this.messages = messages; @@ -1299,19 +1307,20 @@ class PromptManager { /** * Set and process a finished chat completion object * - * @param {ChatCompletion} chatCompletion + * @param {import('./openai.js').ChatCompletion} chatCompletion */ setChatCompletion(chatCompletion) { const messages = chatCompletion.getMessages(); this.setMessages(messages); this.populateTokenCounts(messages); + this.overriddenPrompts = chatCompletion.getOverriddenPrompts(); } /** * Populates the token handler * - * @param {MessageCollection} messages + * @param {import('./openai.js').MessageCollection} messages */ populateTokenCounts(messages) { this.tokenHandler.resetCounts(); @@ -1525,6 +1534,7 @@ class PromptManager { const isImportantPrompt = !prompt.marker && prompt.system_prompt && prompt.injection_position !== INJECTION_POSITION.ABSOLUTE && prompt.forbid_overrides; const isUserPrompt = !prompt.marker && !prompt.system_prompt && prompt.injection_position !== INJECTION_POSITION.ABSOLUTE; const isInjectionPrompt = !prompt.marker && prompt.injection_position === INJECTION_POSITION.ABSOLUTE; + const isOverriddenPrompt = Array.isArray(this.overriddenPrompts) && this.overriddenPrompts.includes(prompt.identifier); const importantClass = isImportantPrompt ? `${prefix}prompt_manager_important` : ''; listItemHtml += `
  • @@ -1536,6 +1546,7 @@ class PromptManager { ${isInjectionPrompt ? '' : ''} ${this.isPromptInspectionAllowed(prompt) ? `${encodedName}` : encodedName} ${isInjectionPrompt ? `@ ${prompt.injection_depth}` : ''} + ${isOverriddenPrompt ? '' : ''} diff --git a/public/scripts/openai.js b/public/scripts/openai.js index e265276c3..b23c8347a 100644 --- a/public/scripts/openai.js +++ b/public/scripts/openai.js @@ -904,6 +904,7 @@ async function populateChatCompletion(prompts, chatCompletion, { bias, quietProm addToChatCompletion('personaDescription'); // Collection of control prompts that will always be positioned last + chatCompletion.setOverriddenPrompts(prompts.overriddenPrompts); const controlPrompts = new MessageCollection('controlPrompts'); const impersonateMessage = Message.fromPrompt(prompts.get('impersonate')) ?? null; @@ -1095,7 +1096,7 @@ function preparePromptsForChatCompletion({ Scenario, charPersonality, name2, wor const mainOriginalContent = systemPrompt.content; systemPrompt.content = systemPromptOverride; const mainReplacement = promptManager.preparePrompt(systemPrompt, mainOriginalContent); - prompts.set(mainReplacement, prompts.index('main')); + prompts.override(mainReplacement, prompts.index('main')); } // Apply character-specific jailbreak @@ -1104,7 +1105,7 @@ function preparePromptsForChatCompletion({ Scenario, charPersonality, name2, wor const jbOriginalContent = jailbreakPrompt.content; jailbreakPrompt.content = jailbreakPromptOverride; const jbReplacement = promptManager.preparePrompt(jailbreakPrompt, jbOriginalContent); - prompts.set(jbReplacement, prompts.index('jailbreak')); + prompts.override(jbReplacement, prompts.index('jailbreak')); } return prompts; @@ -2205,7 +2206,7 @@ class MessageCollection { * @see https://platform.openai.com/docs/guides/gpt/chat-completions-api * */ -class ChatCompletion { +export class ChatCompletion { /** * Combines consecutive system messages into one if they have no name attached. @@ -2250,6 +2251,7 @@ class ChatCompletion { this.tokenBudget = 0; this.messages = new MessageCollection('root'); this.loggingEnabled = false; + this.overriddenPrompts = []; } /** @@ -2524,6 +2526,18 @@ class ChatCompletion { } return index; } + + /** + * Sets the list of overridden prompts. + * @param {string[]} list A list of prompts that were overridden. + */ + setOverriddenPrompts(list) { + this.overriddenPrompts = list; + } + + getOverriddenPrompts() { + return this.overriddenPrompts ?? []; + } } function loadOpenAISettings(data, settings) {