Move command from script.js
This commit is contained in:
parent
53c39a403d
commit
7b3d13ac00
118
public/script.js
118
public/script.js
|
@ -20,8 +20,6 @@ import {
|
||||||
validateTextGenUrl,
|
validateTextGenUrl,
|
||||||
parseTextgenLogprobs,
|
parseTextgenLogprobs,
|
||||||
parseTabbyLogprobs,
|
parseTabbyLogprobs,
|
||||||
textgenerationwebui_settings,
|
|
||||||
SERVER_INPUTS,
|
|
||||||
} from './scripts/textgen-settings.js';
|
} from './scripts/textgen-settings.js';
|
||||||
|
|
||||||
const { MANCER, TOGETHERAI, OOBA, VLLM, APHRODITE, TABBY, OLLAMA, INFERMATICAI, DREAMGEN, OPENROUTER, FEATHERLESS } = textgen_types;
|
const { MANCER, TOGETHERAI, OOBA, VLLM, APHRODITE, TABBY, OLLAMA, INFERMATICAI, DREAMGEN, OPENROUTER, FEATHERLESS } = textgen_types;
|
||||||
|
@ -244,7 +242,7 @@ import { DragAndDropHandler } from './scripts/dragdrop.js';
|
||||||
import { INTERACTABLE_CONTROL_CLASS, initKeyboard } from './scripts/keyboard.js';
|
import { INTERACTABLE_CONTROL_CLASS, initKeyboard } from './scripts/keyboard.js';
|
||||||
import { initDynamicStyles } from './scripts/dynamic-styles.js';
|
import { initDynamicStyles } from './scripts/dynamic-styles.js';
|
||||||
import { SlashCommandEnumValue, enumTypes } from './scripts/slash-commands/SlashCommandEnumValue.js';
|
import { SlashCommandEnumValue, enumTypes } from './scripts/slash-commands/SlashCommandEnumValue.js';
|
||||||
import { commonEnumProviders, enumIcons } from './scripts/slash-commands/SlashCommandCommonEnumsProvider.js';
|
import { enumIcons } from './scripts/slash-commands/SlashCommandCommonEnumsProvider.js';
|
||||||
|
|
||||||
//exporting functions and vars for mods
|
//exporting functions and vars for mods
|
||||||
export {
|
export {
|
||||||
|
@ -8521,77 +8519,6 @@ async function connectAPISlash(_, text) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the API URL and triggers the text generation web UI button click.
|
|
||||||
*
|
|
||||||
* @param {object} args - named args
|
|
||||||
* @param {string?} [args.api=null] - the API name to set/get the URL for
|
|
||||||
* @param {string?} [args.connect=true] - whether to connect to the API after setting
|
|
||||||
* @param {string} url - the API URL to set
|
|
||||||
* @returns {Promise<string>}
|
|
||||||
*/
|
|
||||||
async function setApiUrlCallback({ api = null, connect = 'true' }, url) {
|
|
||||||
// Special handling for Chat Completion Custom OpenAI compatible, that one can also support API url handling
|
|
||||||
const isCurrentlyCustomOpenai = main_api === 'openai' && oai_settings.chat_completion_source === chat_completion_sources.CUSTOM;
|
|
||||||
if (api === chat_completion_sources.CUSTOM || (!api && isCurrentlyCustomOpenai)) {
|
|
||||||
if (url && !isCurrentlyCustomOpenai) {
|
|
||||||
toastr.warning(`Custom OpenAI API is not the currently selected API, so we cannot do an auto-connect. Consider switching to it via /api beforehand.`);
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!url) {
|
|
||||||
return oai_settings.custom_url ?? '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$('#custom_api_url_text').val(url).trigger('input');
|
|
||||||
|
|
||||||
if (isTrueBoolean(connect)) {
|
|
||||||
$('#api_button_openai').trigger('click');
|
|
||||||
}
|
|
||||||
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do some checks and get the api type we are targeting with this command
|
|
||||||
if (api && !Object.values(textgen_types).includes(api)) {
|
|
||||||
toastr.warning(`API '${api}' is not a valid text_gen API.`);
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
if (!api && !Object.values(textgen_types).includes(textgenerationwebui_settings.type)) {
|
|
||||||
toastr.warning(`API '${textgenerationwebui_settings.type}' is not a valid text_gen API.`);
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
if (api && url && isTrueBoolean(connect) && api !== textgenerationwebui_settings.type) {
|
|
||||||
toastr.warning(`API '${api}' is not the currently selected API, so we cannot do an auto-connect. Consider switching to it via /api beforehand.`);
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
const type = api || textgenerationwebui_settings.type;
|
|
||||||
|
|
||||||
const inputSelector = SERVER_INPUTS[type];
|
|
||||||
if (!inputSelector) {
|
|
||||||
toastr.warning(`API '${type}' does not have a server url input.`);
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
// If no url was provided, return the current one
|
|
||||||
if (!url) {
|
|
||||||
return textgenerationwebui_settings.server_urls[type] ?? '';
|
|
||||||
}
|
|
||||||
|
|
||||||
// else, we want to actually set the url
|
|
||||||
$(inputSelector).val(url).trigger('input');
|
|
||||||
// trigger blur debounced, so we hide the autocomplete menu
|
|
||||||
setTimeout(() => $(inputSelector).trigger('blur'), 1);
|
|
||||||
|
|
||||||
// Trigger the auto connect via connect button, if requested
|
|
||||||
if (isTrueBoolean(connect)) {
|
|
||||||
$('#api_button_textgenerationwebui').trigger('click');
|
|
||||||
}
|
|
||||||
|
|
||||||
// We still re-acquire the value, as it might have been modified by the validation on connect
|
|
||||||
return textgenerationwebui_settings.server_urls[type] ?? '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Imports supported files dropped into the app window.
|
* Imports supported files dropped into the app window.
|
||||||
* @param {File[]} files Array of files to process
|
* @param {File[]} files Array of files to process
|
||||||
|
@ -9070,49 +8997,6 @@ jQuery(async function () {
|
||||||
</div>
|
</div>
|
||||||
`,
|
`,
|
||||||
}));
|
}));
|
||||||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({
|
|
||||||
name: 'api-url',
|
|
||||||
callback: setApiUrlCallback,
|
|
||||||
returns: 'the current API url',
|
|
||||||
aliases: ['server'],
|
|
||||||
namedArgumentList: [
|
|
||||||
SlashCommandNamedArgument.fromProps({
|
|
||||||
name: 'api',
|
|
||||||
description: 'API to set/get the URL for - if not provided, current API is used',
|
|
||||||
typeList: [ARGUMENT_TYPE.STRING],
|
|
||||||
enumList: [
|
|
||||||
new SlashCommandEnumValue('custom', 'custom openai compatible', enumTypes.getBasedOnIndex(uniqueAPIs.findIndex(x => x === 'openai')), 'O'),
|
|
||||||
...Object.values(textgen_types).map(api => new SlashCommandEnumValue(api, null, enumTypes.getBasedOnIndex(uniqueAPIs.findIndex(x => x === 'textgenerationwebui')), 'T')),
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
SlashCommandNamedArgument.fromProps({
|
|
||||||
name: 'connect',
|
|
||||||
description: 'Whether to auto-connect to the API after setting the URL',
|
|
||||||
typeList: [ARGUMENT_TYPE.BOOLEAN],
|
|
||||||
defaultValue: 'true',
|
|
||||||
enumList: commonEnumProviders.boolean('trueFalse')(),
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
unnamedArgumentList: [
|
|
||||||
SlashCommandArgument.fromProps({
|
|
||||||
description: 'API url to connect to',
|
|
||||||
typeList: [ARGUMENT_TYPE.STRING],
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
helpString: `
|
|
||||||
<div>
|
|
||||||
Set the API url / server url for the currently selected API, including the port. If no argument is provided, it will return the current API url.
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
If a manual API is provided to <b>set</b>the URL, make sure to set <code>connect=false</code>, as auto-connect only works for the currently selected API,
|
|
||||||
or consider switching to it with <code>/api</code> first.
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
This slash command works for most of the Text Completion sources, and also Custom OpenAI compatible for the Chat Completion sources. If unsure which APIs are supported,
|
|
||||||
check the auto-completion of the optional <code>api</code> argument of this command.
|
|
||||||
</div>
|
|
||||||
`,
|
|
||||||
}));
|
|
||||||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({
|
SlashCommandParser.addCommandObject(SlashCommand.fromProps({
|
||||||
name: 'impersonate',
|
name: 'impersonate',
|
||||||
callback: doImpersonate,
|
callback: doImpersonate,
|
||||||
|
|
|
@ -49,7 +49,7 @@ import { findGroupMemberId, groups, is_group_generating, openGroupById, resetSel
|
||||||
import { chat_completion_sources, oai_settings, setupChatCompletionPromptManager } from './openai.js';
|
import { chat_completion_sources, oai_settings, setupChatCompletionPromptManager } from './openai.js';
|
||||||
import { autoSelectPersona, retriggerFirstMessageOnEmptyChat, setPersonaLockState, togglePersonaLock, user_avatar } from './personas.js';
|
import { autoSelectPersona, retriggerFirstMessageOnEmptyChat, setPersonaLockState, togglePersonaLock, user_avatar } from './personas.js';
|
||||||
import { addEphemeralStoppingString, chat_styles, flushEphemeralStoppingStrings, power_user } from './power-user.js';
|
import { addEphemeralStoppingString, chat_styles, flushEphemeralStoppingStrings, power_user } from './power-user.js';
|
||||||
import { textgen_types, textgenerationwebui_settings } from './textgen-settings.js';
|
import { SERVER_INPUTS, textgen_types, textgenerationwebui_settings } from './textgen-settings.js';
|
||||||
import { decodeTextTokens, getFriendlyTokenizerName, getTextTokens, getTokenCountAsync } from './tokenizers.js';
|
import { decodeTextTokens, getFriendlyTokenizerName, getTextTokens, getTokenCountAsync } from './tokenizers.js';
|
||||||
import { debounce, delay, isFalseBoolean, isTrueBoolean, showFontAwesomePicker, stringToRange, trimToEndSentence, trimToStartSentence, waitUntilCondition } from './utils.js';
|
import { debounce, delay, isFalseBoolean, isTrueBoolean, showFontAwesomePicker, stringToRange, trimToEndSentence, trimToStartSentence, waitUntilCondition } from './utils.js';
|
||||||
import { registerVariableCommands, resolveVariable } from './variables.js';
|
import { registerVariableCommands, resolveVariable } from './variables.js';
|
||||||
|
@ -1511,6 +1511,49 @@ export function initDefaultSlashCommands() {
|
||||||
</div>
|
</div>
|
||||||
`,
|
`,
|
||||||
}));
|
}));
|
||||||
|
SlashCommandParser.addCommandObject(SlashCommand.fromProps({
|
||||||
|
name: 'api-url',
|
||||||
|
callback: setApiUrlCallback,
|
||||||
|
returns: 'the current API url',
|
||||||
|
aliases: ['server'],
|
||||||
|
namedArgumentList: [
|
||||||
|
SlashCommandNamedArgument.fromProps({
|
||||||
|
name: 'api',
|
||||||
|
description: 'API to set/get the URL for - if not provided, current API is used',
|
||||||
|
typeList: [ARGUMENT_TYPE.STRING],
|
||||||
|
enumList: [
|
||||||
|
new SlashCommandEnumValue('custom', 'custom openai compatible', enumTypes.getBasedOnIndex(uniqueAPIs.findIndex(x => x === 'openai')), 'O'),
|
||||||
|
...Object.values(textgen_types).map(api => new SlashCommandEnumValue(api, null, enumTypes.getBasedOnIndex(uniqueAPIs.findIndex(x => x === 'textgenerationwebui')), 'T')),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
SlashCommandNamedArgument.fromProps({
|
||||||
|
name: 'connect',
|
||||||
|
description: 'Whether to auto-connect to the API after setting the URL',
|
||||||
|
typeList: [ARGUMENT_TYPE.BOOLEAN],
|
||||||
|
defaultValue: 'true',
|
||||||
|
enumList: commonEnumProviders.boolean('trueFalse')(),
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
unnamedArgumentList: [
|
||||||
|
SlashCommandArgument.fromProps({
|
||||||
|
description: 'API url to connect to',
|
||||||
|
typeList: [ARGUMENT_TYPE.STRING],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
helpString: `
|
||||||
|
<div>
|
||||||
|
Set the API url / server url for the currently selected API, including the port. If no argument is provided, it will return the current API url.
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
If a manual API is provided to <b>set</b>the URL, make sure to set <code>connect=false</code>, as auto-connect only works for the currently selected API,
|
||||||
|
or consider switching to it with <code>/api</code> first.
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
This slash command works for most of the Text Completion sources, and also Custom OpenAI compatible for the Chat Completion sources. If unsure which APIs are supported,
|
||||||
|
check the auto-completion of the optional <code>api</code> argument of this command.
|
||||||
|
</div>
|
||||||
|
`,
|
||||||
|
}));
|
||||||
|
|
||||||
registerVariableCommands();
|
registerVariableCommands();
|
||||||
}
|
}
|
||||||
|
@ -3418,6 +3461,77 @@ function setPromptEntryCallback(args, targetState) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the API URL and triggers the text generation web UI button click.
|
||||||
|
*
|
||||||
|
* @param {object} args - named args
|
||||||
|
* @param {string?} [args.api=null] - the API name to set/get the URL for
|
||||||
|
* @param {string?} [args.connect=true] - whether to connect to the API after setting
|
||||||
|
* @param {string} url - the API URL to set
|
||||||
|
* @returns {Promise<string>}
|
||||||
|
*/
|
||||||
|
async function setApiUrlCallback({ api = null, connect = 'true' }, url) {
|
||||||
|
// Special handling for Chat Completion Custom OpenAI compatible, that one can also support API url handling
|
||||||
|
const isCurrentlyCustomOpenai = main_api === 'openai' && oai_settings.chat_completion_source === chat_completion_sources.CUSTOM;
|
||||||
|
if (api === chat_completion_sources.CUSTOM || (!api && isCurrentlyCustomOpenai)) {
|
||||||
|
if (url && !isCurrentlyCustomOpenai) {
|
||||||
|
toastr.warning('Custom OpenAI API is not the currently selected API, so we cannot do an auto-connect. Consider switching to it via /api beforehand.');
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!url) {
|
||||||
|
return oai_settings.custom_url ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#custom_api_url_text').val(url).trigger('input');
|
||||||
|
|
||||||
|
if (isTrueBoolean(connect)) {
|
||||||
|
$('#api_button_openai').trigger('click');
|
||||||
|
}
|
||||||
|
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do some checks and get the api type we are targeting with this command
|
||||||
|
if (api && !Object.values(textgen_types).includes(api)) {
|
||||||
|
toastr.warning(`API '${api}' is not a valid text_gen API.`);
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if (!api && !Object.values(textgen_types).includes(textgenerationwebui_settings.type)) {
|
||||||
|
toastr.warning(`API '${textgenerationwebui_settings.type}' is not a valid text_gen API.`);
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if (api && url && isTrueBoolean(connect) && api !== textgenerationwebui_settings.type) {
|
||||||
|
toastr.warning(`API '${api}' is not the currently selected API, so we cannot do an auto-connect. Consider switching to it via /api beforehand.`);
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
const type = api || textgenerationwebui_settings.type;
|
||||||
|
|
||||||
|
const inputSelector = SERVER_INPUTS[type];
|
||||||
|
if (!inputSelector) {
|
||||||
|
toastr.warning(`API '${type}' does not have a server url input.`);
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no url was provided, return the current one
|
||||||
|
if (!url) {
|
||||||
|
return textgenerationwebui_settings.server_urls[type] ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// else, we want to actually set the url
|
||||||
|
$(inputSelector).val(url).trigger('input');
|
||||||
|
// trigger blur debounced, so we hide the autocomplete menu
|
||||||
|
setTimeout(() => $(inputSelector).trigger('blur'), 1);
|
||||||
|
|
||||||
|
// Trigger the auto connect via connect button, if requested
|
||||||
|
if (isTrueBoolean(connect)) {
|
||||||
|
$('#api_button_textgenerationwebui').trigger('click');
|
||||||
|
}
|
||||||
|
|
||||||
|
// We still re-acquire the value, as it might have been modified by the validation on connect
|
||||||
|
return textgenerationwebui_settings.server_urls[type] ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
export let isExecutingCommandsFromChatInput = false;
|
export let isExecutingCommandsFromChatInput = false;
|
||||||
export let commandsFromChatInputAbortController;
|
export let commandsFromChatInputAbortController;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue