Get available tokenizers from UI
| @@ -212,7 +212,7 @@ import { | |||
| 212 | selectContextPreset, | 212 | selectContextPreset, |
| 213 | } from './scripts/instruct-mode.js'; | 213 | } from './scripts/instruct-mode.js'; |
| 214 | import { initLocales, t, translate } from './scripts/i18n.js'; | 214 | import { initLocales, t, translate } from './scripts/i18n.js'; |
| 215 | import { getFriendlyTokenizerName, getTokenCount, getTokenCountAsync, getTokenizerModel, initTokenizers, saveTokenCache, selectTokenizer, TOKENIZER_NAME_MAP, tokenizers } from './scripts/tokenizers.js'; | 215 | import { getAvailableTokenizers, getFriendlyTokenizerName, getTokenCount, getTokenCountAsync, getTokenizerModel, initTokenizers, saveTokenCache, selectTokenizer } from './scripts/tokenizers.js'; |
| 216 | import { | 216 | import { |
| 217 | user_avatar, | 217 | user_avatar, |
| 218 | getUserAvatars, | 218 | getUserAvatars, |
| @@ -8453,11 +8453,11 @@ async function selectInstructCallback(_, name) { | |||
| 8453 | 8453 | ||
| 8454 | async function selectTokenizerCallback(_, name) { | 8454 | async function selectTokenizerCallback(_, name) { |
| 8455 | if (!name) { | 8455 | if (!name) { |
| 8456 | return TOKENIZER_NAME_MAP[power_user.tokenizer]; | 8456 | return getFriendlyTokenizerName(main_api).tokenizerName; |
| 8457 | } | 8457 | } |
| 8458 | 8458 | ||
| 8459 | const tokenizerNames = Object.values(TOKENIZER_NAME_MAP); | 8459 | const tokenizers = getAvailableTokenizers(); |
| 8460 | const fuse = new Fuse(tokenizerNames); | 8460 | const fuse = new Fuse(tokenizers, { keys: ['tokenizerName'] }); |
| 8461 | const result = fuse.search(name); | 8461 | const result = fuse.search(name); |
| 8462 | 8462 | ||
| 8463 | if (result.length === 0) { | 8463 | if (result.length === 0) { |
| @@ -8465,9 +8465,9 @@ async function selectTokenizerCallback(_, name) { | |||
| 8465 | return ''; | 8465 | return ''; |
| 8466 | } | 8466 | } |
| 8467 | 8467 | ||
| 8468 | const foundName = result[0].item; | 8468 | const foundTokenizer = result[0].item; |
| 8469 | selectTokenizer(tokenizers[foundName.toUpperCase()]); | 8469 | selectTokenizer(foundTokenizer.tokenizerName, foundTokenizer.tokenizerId); |
| 8470 | return foundName; | 8470 | return foundTokenizer; |
| 8471 | } | 8471 | } |
| 8472 | 8472 | ||
| 8473 | async function enableInstructCallback() { | 8473 | async function enableInstructCallback() { |
| @@ -9122,8 +9122,8 @@ jQuery(async function () { | |||
| 9122 | SlashCommandArgument.fromProps({ | 9122 | SlashCommandArgument.fromProps({ |
| 9123 | description: 'tokenizer name', | 9123 | description: 'tokenizer name', |
| 9124 | typeList: [ARGUMENT_TYPE.STRING], | 9124 | typeList: [ARGUMENT_TYPE.STRING], |
| 9125 | enumList: Object.values(TOKENIZER_NAME_MAP).map(tokenizer => | 9125 | enumList: getAvailableTokenizers().map(tokenizer => |
| 9126 | new SlashCommandEnumValue(tokenizer, null, enumTypes.enum, enumIcons.default)), | 9126 | new SlashCommandEnumValue(tokenizer.tokenizerName, null, enumTypes.enum, enumIcons.default)), |
| 9127 | }), | 9127 | }), |
| 9128 | ], | 9128 | ], |
| 9129 | helpString: ` | 9129 | helpString: ` |
| @@ -9132,7 +9132,7 @@ jQuery(async function () { | |||
| 9132 | </div> | 9132 | </div> |
| 9133 | <div> | 9133 | <div> |
| 9134 | <strong>Available tokenizers:</strong> | 9134 | <strong>Available tokenizers:</strong> |
| 9135 | <pre><code>${Object.values(TOKENIZER_NAME_MAP).join(', ')}</code></pre> | 9135 | <pre><code>${getAvailableTokenizers().map(t => t.tokenizerName).join(', ')}</code></pre> |
| 9136 | </div> | 9136 | </div> |
| 9137 | ` | 9137 | ` |
| 9138 | })); | 9138 | })); |
| @@ -148,20 +148,26 @@ async function resetTokenCache() { | |||
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | /** | 150 | /** |
| 151 | * Maps tokenizer IDs to their names. | 151 | * Gets all tokenizers available to the user. |
| 152 | * @example { 0: 'none', 1: 'gpt2', ... } | 152 | * @returns { { tokenizerName: string, tokenizerId: number }[] } Tokenizer info. |
| 153 | */ | 153 | */ |
| 154 | export const TOKENIZER_NAME_MAP = Object.fromEntries( | 154 | export function getAvailableTokenizers() { |
| 155 | Object.entries(tokenizers).map(([name, id]) => [id, name.toLowerCase()])); | 155 | const tokenizerOptions = $('#tokenizer').find('option').toArray(); |
| 156 | return tokenizerOptions.map(tokenizerOption => ({ | ||
| 157 | tokenizerName: tokenizerOption.text, | ||
| 158 | tokenizerId: Number(tokenizerOption.value), | ||
| 159 | })) | ||
| 160 | } | ||
| 156 | 161 | ||
| 157 | /** | 162 | /** |
| 158 | * Selects tokenizer if not already selected. | 163 | * Selects tokenizer if not already selected. |
| 164 | * @param {string} tokenizerName Tokenizer name. | ||
| 159 | * @param {number} tokenizerId Tokenizer ID. | 165 | * @param {number} tokenizerId Tokenizer ID. |
| 160 | */ | 166 | */ |
| 161 | export function selectTokenizer(tokenizerId) { | 167 | export function selectTokenizer(tokenizerName, tokenizerId) { |
| 162 | if (tokenizerId !== power_user.tokenizer) { | 168 | if (tokenizerId !== power_user.tokenizer) { |
| 163 | $('#tokenizer').val(tokenizerId).trigger('change'); | 169 | $('#tokenizer').val(tokenizerId).trigger('change'); |
| 164 | toastr.info(`Tokenizer: "${TOKENIZER_NAME_MAP[tokenizerId]}" selected`); | 170 | toastr.info(`Tokenizer: "${tokenizerName}" selected`); |
| 165 | } | 171 | } |
| 166 | } | 172 | } |
| 167 | 173 | ||