Merge pull request #3315 from SillyTavern/extensions-config config.yaml: Group extension settings into one section

bbd85fc823921f882f0785a41fe89a0558d96cdb

Cohee <18619528+Cohee1207@users.noreply.github.com>

Signed
6 files changed, +67 -25Ignore whitespace
default/config.yaml+17 -15
@@ -133,24 +133,26 @@ whitelistImportDomains:
133133## headers:
134134## User-Agent: "Googlebot/2.1 (+http://www.google.com/bot.html)"
135135requestOverrides: []
136-# -- EXTENSIONS CONFIGURATION --
136+
137137# Enable UIEXTENSIONS extensionsCONFIGURATION
138-enableExtensions: true
138+extensions:
139-# Automatically update extensions when a release version changes
139+ # Enable UI extensions
140140enableExtensionsAutoUpdate enabled: true
141+ # Automatically update extensions when a release version changes
142+ autoUpdate: true
143+ models:
144+ # Enables automatic model download from HuggingFace
145+ autoDownload: true
146+ # Additional models for extensions. Expects model IDs from HuggingFace model hub in ONNX format
147+ classification: Cohee/distilbert-base-uncased-go-emotions-onnx
148+ captioning: Xenova/vit-gpt2-image-captioning
149+ embedding: Cohee/jina-embeddings-v2-base-en
150+ speechToText: Xenova/whisper-small
151+ textToSpeech: Xenova/speecht5_tts
152+
141153# Additional model tokenizers can be downloaded on demand.
142154# Disabling will fallback to another locally available tokenizer.
143155enableDownloadableTokenizers: true
144-# Extension settings
145-extras:
146- # Disables automatic model download from HuggingFace
147- disableAutoDownload: false
148- # Extra models for plugins. Expects model IDs from HuggingFace model hub in ONNX format
149- classificationModel: Cohee/distilbert-base-uncased-go-emotions-onnx
150- captioningModel: Xenova/vit-gpt2-image-captioning
151- embeddingModel: Cohee/jina-embeddings-v2-base-en
152- speechToTextModel: Xenova/whisper-small
153- textToSpeechModel: Xenova/speecht5_tts
154156# -- OPENAI CONFIGURATION --
155157# A placeholder message to use in strict prompt post-processing mode when the prompt doesn't start with a user message
156158promptPlaceholder: "[Start a new chat]"
jsconfig.json+1 -1
@@ -15,7 +15,7 @@
1515 "**/node_modules/**",
1616 "**/dist/**",
1717 "**/.git/**",
1818 "public/lib/**",
1919 "backups/**",
2020 "data/**",
2121 "cache/**",
post-install.js+40 -0
@@ -64,6 +64,46 @@ const keyMigrationMap = [
6464 newKey: 'backups.chat.throttleInterval',
6565 migrate: (value) => value,
6666 },
67+ {
68+ oldKey: 'enableExtensions',
69+ newKey: 'extensions.enabled',
70+ migrate: (value) => value,
71+ },
72+ {
73+ oldKey: 'enableExtensionsAutoUpdate',
74+ newKey: 'extensions.autoUpdate',
75+ migrate: (value) => value,
76+ },
77+ {
78+ oldKey: 'extras.disableAutoDownload',
79+ newKey: 'extensions.models.autoDownload',
80+ migrate: (value) => !value,
81+ },
82+ {
83+ oldKey: 'extras.classificationModel',
84+ newKey: 'extensions.models.classification',
85+ migrate: (value) => value,
86+ },
87+ {
88+ oldKey: 'extras.captioningModel',
89+ newKey: 'extensions.models.captioning',
90+ migrate: (value) => value,
91+ },
92+ {
93+ oldKey: 'extras.embeddingModel',
94+ newKey: 'extensions.models.embedding',
95+ migrate: (value) => value,
96+ },
97+ {
98+ oldKey: 'extras.speechToTextModel',
99+ newKey: 'extensions.models.speechToText',
100+ migrate: (value) => value,
101+ },
102+ {
103+ oldKey: 'extras.textToSpeechModel',
104+ newKey: 'extensions.models.textToSpeech',
105+ migrate: (value) => value,
106+ },
67107];
68108
69109/**
src/endpoints/settings.js+2 -2
@@ -10,8 +10,8 @@ import { getConfigValue, generateTimestamp, removeOldBackups } from '../util.js'
1010import { jsonParser } from '../express-common.js';
1111import { getAllUserHandles, getUserDirectories } from '../users.js';
1212
1313const ENABLE_EXTENSIONS = !!getConfigValue('enableExtensionsextensions.enabled', true);
1414const ENABLE_EXTENSIONS_AUTO_UPDATE = !!getConfigValue('enableExtensionsAutoUpdateextensions.autoUpdate', true);
1515const ENABLE_ACCOUNTS = getConfigValue('enableUserAccounts', false);
1616
1717// 10 minutes
src/endpoints/vectors.js+1 -1
@@ -164,7 +164,7 @@ function getSourceSettings(source, request) {
164164 };
165165 case 'transformers':
166166 return {
167167 model: getConfigValue('extrasextensions.embeddingModelmodels.embedding', ''),
168168 };
169169 case 'palm':
170170 return {
src/transformers.js+6 -6
@@ -19,31 +19,31 @@ const tasks = {
1919 'text-classification': {
2020 defaultModel: 'Cohee/distilbert-base-uncased-go-emotions-onnx',
2121 pipeline: null,
2222 configField: 'extrasextensions.classificationModelmodels.classification',
2323 quantized: true,
2424 },
2525 'image-to-text': {
2626 defaultModel: 'Xenova/vit-gpt2-image-captioning',
2727 pipeline: null,
2828 configField: 'extrasextensions.captioningModelmodels.captioning',
2929 quantized: true,
3030 },
3131 'feature-extraction': {
3232 defaultModel: 'Xenova/all-mpnet-base-v2',
3333 pipeline: null,
3434 configField: 'extrasextensions.embeddingModelmodels.embedding',
3535 quantized: true,
3636 },
3737 'automatic-speech-recognition': {
3838 defaultModel: 'Xenova/whisper-small',
3939 pipeline: null,
4040 configField: 'extrasextensions.speechToTextModelmodels.speechToText',
4141 quantized: true,
4242 },
4343 'text-to-speech': {
4444 defaultModel: 'Xenova/speecht5_tts',
4545 pipeline: null,
4646 configField: 'extrasextensions.textToSpeechModelmodels.textToSpeech',
4747 quantized: false,
4848 },
4949};
@@ -132,7 +132,7 @@ export async function getPipeline(task, forceModel = '') {
132132
133133 const cacheDir = path.join(globalThis.DATA_ROOT, '_cache');
134134 const model = forceModel || getModelForTask(task);
135135 const localOnly = !getConfigValue('extrasextensions.disableAutoDownloadmodels.autoDownload', falsetrue);
136136 console.log('Initializing transformers.js pipeline for task', task, 'with model', model);
137137 const instance = await pipeline(task, model, { cache_dir: cacheDir, quantized: tasks[task].quantized ?? true, local_files_only: localOnly });
138138 tasks[task].pipeline = instance;