diff --git a/public/img/cohere.svg b/public/img/cohere.svg new file mode 100644 index 000000000..a213ae8d8 --- /dev/null +++ b/public/img/cohere.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/public/index.html b/public/index.html index 684226abf..928061b0c 100644 --- a/public/index.html +++ b/public/index.html @@ -458,7 +458,7 @@ -
+
Temperature
@@ -471,7 +471,7 @@
-
+
Frequency Penalty
@@ -484,7 +484,7 @@
-
+
Presence Penalty
@@ -510,20 +510,20 @@
-
+
Top K
- +
-
+
Top P
@@ -759,7 +759,7 @@
-
+
Seed
@@ -2259,15 +2259,20 @@ Chat Completion Source
@@ -2659,6 +2664,30 @@
+
+

Cohere API Key

+
+ + +
+
+ For privacy reasons, your API key will be hidden after you reload the page. +
+
+

Cohere Model

+ +
+

Custom Endpoint (Base URL)

diff --git a/public/script.js b/public/script.js index 8252c0b79..3078d8a88 100644 --- a/public/script.js +++ b/public/script.js @@ -4836,7 +4836,7 @@ function extractMessageFromData(data) { case 'novel': return data.output; case 'openai': - return data?.choices?.[0]?.message?.content ?? data?.choices?.[0]?.text ?? ''; + return data?.choices?.[0]?.message?.content ?? data?.choices?.[0]?.text ?? data?.text ?? ''; default: return ''; } @@ -8187,6 +8187,11 @@ const CONNECT_API_MAP = { button: '#api_button_openai', source: chat_completion_sources.CUSTOM, }, + 'cohere': { + selected: 'cohere', + button: '#api_button_openai', + source: chat_completion_sources.COHERE, + }, 'infermaticai': { selected: 'textgenerationwebui', button: '#api_button_textgenerationwebui', @@ -8587,7 +8592,7 @@ jQuery(async function () { $('#groupCurrentMemberListToggle .inline-drawer-icon').trigger('click'); }, 200); - $('#chat').on('mousewheel touchstart', () => { + $('#chat').on('wheel touchstart', () => { scrollLock = true; }); diff --git a/public/scripts/RossAscends-mods.js b/public/scripts/RossAscends-mods.js index 054641268..87cbbff2c 100644 --- a/public/scripts/RossAscends-mods.js +++ b/public/scripts/RossAscends-mods.js @@ -350,6 +350,7 @@ function RA_autoconnect(PrevApi) { || (secret_state[SECRET_KEYS.AI21] && oai_settings.chat_completion_source == chat_completion_sources.AI21) || (secret_state[SECRET_KEYS.MAKERSUITE] && oai_settings.chat_completion_source == chat_completion_sources.MAKERSUITE) || (secret_state[SECRET_KEYS.MISTRALAI] && oai_settings.chat_completion_source == chat_completion_sources.MISTRALAI) + || (secret_state[SECRET_KEYS.COHERE] && oai_settings.chat_completion_source == chat_completion_sources.COHERE) || (isValidUrl(oai_settings.custom_url) && oai_settings.chat_completion_source == chat_completion_sources.CUSTOM) ) { $('#api_button_openai').trigger('click'); diff --git a/public/scripts/extensions/memory/index.js b/public/scripts/extensions/memory/index.js index 00c6de443..7071eb8a3 100644 --- a/public/scripts/extensions/memory/index.js +++ b/public/scripts/extensions/memory/index.js @@ -122,6 +122,44 @@ function loadSettings() { switchSourceControls(extension_settings.memory.source); } +async function onPromptForceWordsAutoClick() { + const context = getContext(); + const maxPromptLength = getMaxContextSize(extension_settings.memory.overrideResponseLength); + const chat = context.chat; + const allMessages = chat.filter(m => !m.is_system && m.mes).map(m => m.mes); + const messagesWordCount = allMessages.map(m => extractAllWords(m)).flat().length; + const averageMessageWordCount = messagesWordCount / allMessages.length; + const tokensPerWord = getTokenCount(allMessages.join('\n')) / messagesWordCount; + const wordsPerToken = 1 / tokensPerWord; + const maxPromptLengthWords = Math.round(maxPromptLength * wordsPerToken); + // How many words should pass so that messages will start be dropped out of context; + const wordsPerPrompt = Math.floor(maxPromptLength / tokensPerWord); + // How many words will be needed to fit the allowance buffer + const summaryPromptWords = extractAllWords(extension_settings.memory.prompt).length; + const promptAllowanceWords = maxPromptLengthWords - extension_settings.memory.promptWords - summaryPromptWords; + const averageMessagesPerPrompt = Math.floor(promptAllowanceWords / averageMessageWordCount); + const maxMessagesPerSummary = extension_settings.memory.maxMessagesPerRequest || 0; + const targetMessagesInPrompt = maxMessagesPerSummary > 0 ? maxMessagesPerSummary : Math.max(0, averageMessagesPerPrompt); + const targetSummaryWords = (targetMessagesInPrompt * averageMessageWordCount) + (promptAllowanceWords / 4); + + console.table({ + maxPromptLength, + maxPromptLengthWords, + promptAllowanceWords, + averageMessagesPerPrompt, + targetMessagesInPrompt, + targetSummaryWords, + wordsPerPrompt, + wordsPerToken, + tokensPerWord, + messagesWordCount, + }); + + const ROUNDING = 100; + extension_settings.memory.promptForceWords = Math.max(1, Math.floor(targetSummaryWords / ROUNDING) * ROUNDING); + $('#memory_prompt_words_force').val(extension_settings.memory.promptForceWords).trigger('input'); +} + async function onPromptIntervalAutoClick() { const context = getContext(); const maxPromptLength = getMaxContextSize(extension_settings.memory.overrideResponseLength); @@ -136,8 +174,8 @@ async function onPromptIntervalAutoClick() { const promptAllowance = maxPromptLength - promptTokens - targetSummaryTokens; const maxMessagesPerSummary = extension_settings.memory.maxMessagesPerRequest || 0; const averageMessagesPerPrompt = Math.floor(promptAllowance / averageMessageTokenCount); - const unfitMessages = maxMessagesPerSummary > 0 ? averageMessagesPerPrompt - maxMessagesPerSummary : 0; - const adjustedAverageMessagesPerPrompt = Math.max(1, averageMessagesPerPrompt - (unfitMessages > 0 ? Math.ceil(unfitMessages / 2) : 0)); + const targetMessagesInPrompt = maxMessagesPerSummary > 0 ? maxMessagesPerSummary : Math.max(0, averageMessagesPerPrompt); + const adjustedAverageMessagesPerPrompt = targetMessagesInPrompt + (averageMessagesPerPrompt - targetMessagesInPrompt) / 4; console.table({ maxPromptLength, @@ -149,9 +187,9 @@ async function onPromptIntervalAutoClick() { tokensPerWord, averageMessageTokenCount, averageMessagesPerPrompt, + targetMessagesInPrompt, adjustedAverageMessagesPerPrompt, maxMessagesPerSummary, - unfitMessages, }); const ROUNDING = 5; @@ -800,6 +838,7 @@ function setupListeners() { $('#memory_prompt_builder_raw_non_blocking').off('click').on('input', onMemoryPromptBuilderInput); $('#memory_prompt_restore').off('click').on('click', onMemoryPromptRestoreClick); $('#memory_prompt_interval_auto').off('click').on('click', onPromptIntervalAutoClick); + $('#memory_prompt_words_auto').off('click').on('click', onPromptForceWordsAutoClick); $('#memory_override_response_length').off('click').on('input', onOverrideResponseLengthInput); $('#memory_max_messages_per_request').off('click').on('input', onMaxMessagesPerRequestInput); $('#summarySettingsBlockToggle').off('click').on('click', function () { diff --git a/public/scripts/extensions/memory/settings.html b/public/scripts/extensions/memory/settings.html index 7bf3626e7..ed3b31ad7 100644 --- a/public/scripts/extensions/memory/settings.html +++ b/public/scripts/extensions/memory/settings.html @@ -17,7 +17,9 @@
Current summary: - +
@@ -27,7 +29,10 @@ Summarize now
- +
-