mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2024-12-14 10:24:47 +01:00
1d75b98393
* set isForced to true on input * make floating auto-complete follow horizontal scrolling * add callable closure vars * changes to /let and /var for callable closures * fix error message * fix scope for closure arguments * if should return the pipe result from closures * use /run to call closures and no arguments on immediate closures * throw exception from QRs window-function if no match * when to show autocomplete vs info only * autocomplete positioning * autocomplete styling * add theming to autocomplete (theme, dark, light) * improve autocomplete show/hide logic and editor selection * use blur tint color instead of chat tint color and use blur setting * cleanup and docs * use scope macros for QR args * add enter to select autocomplete * fix no executor found * cleanup and comment * fix alias list in help string * fallback to empty string piped value if null or undefined * fix typo * blur textarea on ctrl+enter execute (and refocus after) * stop executeSlashCommand if parser throws * move /let and /var callbacks into functions * switch textarea to monospace when value starts with slash * add double pipe a pipe breaker * fix /? slash * remove some logging * add "/:name" as shorthand for "/run name" after all * move shit around * fix error message * use testRunShorthandEnd * use parseQuotedValue and parseValue to determine name for "/:" QR labels and set names can include spaces * add some adjustments to make autocomplete work properly some hint in there about "/:" would still be nice * add autocomplete style selector * only strip quotes from subcommand if they are at both ends * fix JSDoc * escaping * allow open quotes on dry run * throwing shit at the wall for /: autocomplete * escapes only for symbols * clean up autocomplete * improve performance * fix scope macros * remove unescaping of pipes * fix macros in scope copy * fix "/? slash" * don't run parser for getNameAt if text has not changed * fix options filter * re-enable blur listener * restore selection on non-replace select * fix for escaping first character of value * add support for {{pipe}} and {{var::}} closures * add index support to var macro * add scoped var macro to macro help * more escape fixes * reduce autocomplete render debounce * cleanup * restore old escape handling and parser flag for strict escaping * fix "no match" autocomplete message * add dummy commands for comments and parser flag * fix type annotations * somewhat safer macro replacements * fix autocomplete select on blank / "no match" * fix cutting off handled part in substitution * add parser flag REPLACE_GETVAR Replaces all {{getvar::}} and {{getglobalvar::}} macros with {{var::}}. Inserts a series of command executors before the command with the macros that: - save {{pipe}} to a var - call /getvar or /getglobalvar to get the variable used in the macro - call /let to save the retrieved variable - return the saved {{pipe}} value This helps to avoid double-substitutions when the var values contain text that could be interpreted as macros. * remove old parser * fix send on enter when no match * deal with pipes in quoted values (loose escaping) * add default parser flags to user settings * allow quoted values in unnamed argument * set parser flag without explicit state to "on" * add click hint on parser error toast * dirty more detailed cmd defs * remove name from unnamed arg * move autocomplete into class and floating with details * replace jQuery's trigger('input') on #send_textarea with native events because jQuery does not dispatch the native event * fix ctrl+space * fix arrow navigation * add comments * fix pointer block * add static fromProps * fix up dummy commands * migrate all commands to addCommandObject * remove commented comment command * fix alias in details * add range as argument type * switch to addCommandObject * switch to addCommandObject * fix height * fix floating details position on left * re-enable blur event * use auto width for full details on floating autocomplete * auto-size floating full details * fix typo * re-enable blur listener * don't prevent enter when selected item is fully typed out * add autocomplete details tooltips * add language to slash command examples * move makeItem into option and command and fix click select * use autocomplete parts in /? slash * fix alias formatting * add language to slash command examples * fix details position on initial input history * small screen styles * replace registerSlashCommand with detailed declarations * put name on first line * add missing returns * fix missing comma * fix alias display in autocomplete list * remove args from help string * move parser settings to its own section * jsdoc * hljs stscript lang * add hljs to autocomplete help examples * add missing import * apply autocomplete colors to stscript codeblocks (hljs) * add fromProps * cache autocomplete elements * towards generic autocomplete * remove unused imports * fix blanks * add return types * re-enable blur * fix blank check * Caption messages by id * add aborting command execution * fix return type * fix chat input font reset * add slash command progress indicator * add missing return * mark registerSlashCommand deprecated * why?? * separate abort logic for commands * remove parsing of quoted values from unnamed arg * add adjustable autocomplete width * revert stop button pulse * add progress and pause/abort to QR editor * add resize event on autocomplete width change * add key= argument to all get vars * refactoring * introduce NamedArgumentAsignment * add TODOs * refactoring * record start and end of named arg assignment * refactoring * prevent duplicate calls to show * refactoring * remove macro ac * add secondary autocomplete and enum descriptions * add syntax highlighting to QR editor * add enum descriptions to /while * add /let key=... to scope variable names * add unnamed argument assignment class and unnamed argument splitting * fix QR editor style * remove dash before autocomplete help text * add autocomplete for unnamed enums * fix remaining dom after holding backslash * fix for unnamed enums * fix autocomplete for /parser-flag * add parser-flag enum help * fix type annotations * fix autocomplete result for /: * add colored autocomplete type icons * collapse second line autocomplete help if empty * mark optional named args in autocomplete * fix when what * remove duplicate debug buttons * dispatch input on autocomplete select * prevent grow from editor syntax layer * add auto-adjust qr editor caret color * remove text-shadow from autocomplete * join value strings in /let and /var * add /abort syntax highlight * fix attempting secondary result when there is none * rename settings headers and split autocomplete / stscript * add parser flag tooltips * add tooltips to chat width stops * fix typo * return clone of help item * fix enum string * don't make optional notice for autocomplete arguments smaller * avoid scrollbar in chat input * add rudimentary macro autocomplete * strip macro from helptext * finally remove closure delimiters around root * cleanup * fix index stuff for removed closure delimiters * fix type hint * add child commands to progress indicator * include sub-separator in macro autocomplete * remove all mentions of interruptsGeneration and purge * remove unused imports * fix syntax highlight with newline at end of input * cleanup select pointer events * coalesce onProgress call * add regex to STscript syntax highlighting * fix closure end * fix autocomplete type icon alignment * adjustments for small screens * fix removing wrong element * add missing "at=" arg to /sys, /comment, /sendas * add font scale setting for autocomplete * add target=_blank for parser flag links * fix for searching enums * remove REGEXP_MODE from hljs just causes trouble * fix autocomplete in closures * fix typo * fix type hint * Get rid of scroll bar on load * Add type hint for /send name argument. Fix 'at' types * Add 'negative' arg hint to /sd command * reenable blur event * Allow /summarize to process any text * Compact layout of script toggles * Expand CSS by default * fix double ranger indicator and adjust to narrow container * make custom css input fill available vertical space * reduce scroll lag * use default cursor on scrollbar * Clean-up module loading in index.html * fix tab indent with hljs --------- Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
143 lines
5.3 KiB
JavaScript
143 lines
5.3 KiB
JavaScript
import { callPopup, main_api } from '../../../script.js';
|
|
import { getContext } from '../../extensions.js';
|
|
import { SlashCommand } from '../../slash-commands/SlashCommand.js';
|
|
import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js';
|
|
import { getFriendlyTokenizerName, getTextTokens, getTokenCountAsync, tokenizers } from '../../tokenizers.js';
|
|
import { resetScrollHeight, debounce } from '../../utils.js';
|
|
import { debounce_timeout } from '../../constants.js';
|
|
|
|
function rgb2hex(rgb) {
|
|
rgb = rgb.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i);
|
|
return (rgb && rgb.length === 4) ? '#' +
|
|
('0' + parseInt(rgb[1], 10).toString(16)).slice(-2) +
|
|
('0' + parseInt(rgb[2], 10).toString(16)).slice(-2) +
|
|
('0' + parseInt(rgb[3], 10).toString(16)).slice(-2) : '';
|
|
}
|
|
|
|
$('button').click(function () {
|
|
var hex = rgb2hex($('input').val());
|
|
$('.result').html(hex);
|
|
});
|
|
|
|
async function doTokenCounter() {
|
|
const { tokenizerName, tokenizerId } = getFriendlyTokenizerName(main_api);
|
|
const html = `
|
|
<div class="wide100p">
|
|
<h3>Token Counter</h3>
|
|
<div class="justifyLeft flex-container flexFlowColumn">
|
|
<h4>Type / paste in the box below to see the number of tokens in the text.</h4>
|
|
<p>Selected tokenizer: ${tokenizerName}</p>
|
|
<div>Input:</div>
|
|
<textarea id="token_counter_textarea" class="wide100p textarea_compact" rows="1"></textarea>
|
|
<div>Tokens: <span id="token_counter_result">0</span></div>
|
|
<hr>
|
|
<div>Tokenized text:</div>
|
|
<div id="tokenized_chunks_display" class="wide100p">—</div>
|
|
<hr>
|
|
<div>Token IDs:</div>
|
|
<textarea id="token_counter_ids" class="wide100p textarea_compact" readonly rows="1">—</textarea>
|
|
</div>
|
|
</div>`;
|
|
|
|
const dialog = $(html);
|
|
const countDebounced = debounce(async () => {
|
|
const text = String($('#token_counter_textarea').val());
|
|
const ids = main_api == 'openai' ? getTextTokens(tokenizers.OPENAI, text) : getTextTokens(tokenizerId, text);
|
|
|
|
if (Array.isArray(ids) && ids.length > 0) {
|
|
$('#token_counter_ids').text(`[${ids.join(', ')}]`);
|
|
$('#token_counter_result').text(ids.length);
|
|
|
|
if (Object.hasOwnProperty.call(ids, 'chunks')) {
|
|
drawChunks(Object.getOwnPropertyDescriptor(ids, 'chunks').value, ids);
|
|
}
|
|
} else {
|
|
const count = await getTokenCountAsync(text);
|
|
$('#token_counter_ids').text('—');
|
|
$('#token_counter_result').text(count);
|
|
$('#tokenized_chunks_display').text('—');
|
|
}
|
|
|
|
resetScrollHeight($('#token_counter_textarea'));
|
|
resetScrollHeight($('#token_counter_ids'));
|
|
}, debounce_timeout.relaxed);
|
|
dialog.find('#token_counter_textarea').on('input', () => countDebounced());
|
|
|
|
$('#dialogue_popup').addClass('wide_dialogue_popup');
|
|
callPopup(dialog, 'text', '', { wide: true, large: true });
|
|
}
|
|
|
|
/**
|
|
* Draws the tokenized chunks in the UI
|
|
* @param {string[]} chunks
|
|
* @param {number[]} ids
|
|
*/
|
|
function drawChunks(chunks, ids) {
|
|
const pastelRainbow = [
|
|
//main_text_color,
|
|
//italics_text_color,
|
|
//quote_text_color,
|
|
'#FFB3BA',
|
|
'#FFDFBA',
|
|
'#FFFFBA',
|
|
'#BFFFBF',
|
|
'#BAE1FF',
|
|
'#FFBAF3',
|
|
];
|
|
$('#tokenized_chunks_display').empty();
|
|
|
|
for (let i = 0; i < chunks.length; i++) {
|
|
let chunk = chunks[i].replace(/▁/g, ' '); // This is a leading space in sentencepiece. More info: Lower one eighth block (U+2581)
|
|
|
|
// If <0xHEX>, decode it
|
|
if (/^<0x[0-9A-F]+>$/i.test(chunk)) {
|
|
const code = parseInt(chunk.substring(3, chunk.length - 1), 16);
|
|
chunk = String.fromCodePoint(code);
|
|
}
|
|
|
|
// If newline - insert a line break
|
|
if (chunk === '\n') {
|
|
$('#tokenized_chunks_display').append('<br>');
|
|
continue;
|
|
}
|
|
|
|
const color = pastelRainbow[i % pastelRainbow.length];
|
|
const chunkHtml = $('<code></code>');
|
|
chunkHtml.css('background-color', color);
|
|
chunkHtml.text(chunk);
|
|
chunkHtml.attr('title', ids[i]);
|
|
$('#tokenized_chunks_display').append(chunkHtml);
|
|
}
|
|
}
|
|
|
|
async function doCount() {
|
|
// get all of the messages in the chat
|
|
const context = getContext();
|
|
const messages = context.chat.filter(x => x.mes && !x.is_system).map(x => x.mes);
|
|
|
|
//concat all the messages into a single string
|
|
const allMessages = messages.join(' ');
|
|
|
|
console.debug('All messages:', allMessages);
|
|
|
|
//toastr success with the token count of the chat
|
|
const count = await getTokenCountAsync(allMessages);
|
|
toastr.success(`Token count: ${count}`);
|
|
}
|
|
|
|
jQuery(() => {
|
|
const buttonHtml = `
|
|
<div id="token_counter" class="list-group-item flex-container flexGap5">
|
|
<div class="fa-solid fa-1 extensionsMenuExtensionButton" /></div>
|
|
Token Counter
|
|
</div>`;
|
|
$('#extensionsMenu').prepend(buttonHtml);
|
|
$('#token_counter').on('click', doTokenCounter);
|
|
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'count',
|
|
callback: doCount,
|
|
returns: 'number of tokens',
|
|
helpString: 'Counts the number of tokens in the current chat.',
|
|
}));
|
|
|
|
});
|