diff --git a/public/index.html b/public/index.html index 3e19d2c88..04baeede2 100644 --- a/public/index.html +++ b/public/index.html @@ -2038,7 +2038,8 @@ SillyTavern-extras - + +
diff --git a/public/scripts/extensions.js b/public/scripts/extensions.js index 2f7c834d8..d2536cace 100644 --- a/public/scripts/extensions.js +++ b/public/scripts/extensions.js @@ -1,11 +1,11 @@ -import { callPopup, eventSource, event_types, saveSettings, saveSettingsDebounced } from "../script.js"; +import { callPopup, eventSource, event_types, extension_prompt_types, saveSettings, saveSettingsDebounced } from "../script.js"; import { isSubsetOf, debounce } from "./utils.js"; export { getContext, getApiUrl, loadExtensionSettings, runGenerationInterceptors, - defaultRequestArgs, + doExtrasFetch, modules, extension_settings, ModuleWorkerWrapper, @@ -43,6 +43,7 @@ class ModuleWorkerWrapper { const extension_settings = { apiUrl: defaultUrl, + apiKey: '', autoConnect: false, disabledExtensions: [], memory: {}, @@ -65,9 +66,29 @@ let activeExtensions = new Set(); const getContext = () => window['SillyTavern'].getContext(); const getApiUrl = () => extension_settings.apiUrl; -const defaultRequestArgs = { method: 'GET', headers: { 'Bypass-Tunnel-Reminder': 'bypass' } }; let connectedToApi = false; +async function doExtrasFetch(endpoint, args) { + if (!args) { + args = {} + } + + if (!args.method) { + Object.assign(args, { method: 'GET' }); + } + + if (!args.headers) { + args.headers = {} + } + Object.assign(args.headers, { + 'Authorization': `Bearer ${extension_settings.apiKey}`, + 'Bypass-Tunnel-Reminder': 'bypass' + }); + + const response = await fetch(endpoint, args); + return response; +} + async function discoverExtensions() { try { const response = await fetch('/discover_extensions'); @@ -178,6 +199,8 @@ async function activateExtensions() { async function connectClickHandler() { const baseUrl = $("#extensions_url").val(); extension_settings.apiUrl = baseUrl; + const testApiKey = $("#extensions_api_key").val(); + extension_settings.apiKey = testApiKey; saveSettingsDebounced(); await connectToApi(baseUrl); } @@ -233,7 +256,7 @@ async function connectToApi(baseUrl) { url.pathname = '/api/modules'; try { - const getExtensionsResult = await fetch(url, defaultRequestArgs); + const getExtensionsResult = await doExtrasFetch(url); if (getExtensionsResult.ok) { const data = await getExtensionsResult.json(); @@ -352,6 +375,7 @@ async function loadExtensionSettings(settings) { } $("#extensions_url").val(extension_settings.apiUrl); + $("#extensions_api_key").val(extension_settings.apiKey); $("#extensions_autoconnect").prop('checked', extension_settings.autoConnect); // Activate offline extensions diff --git a/public/scripts/extensions/caption/index.js b/public/scripts/extensions/caption/index.js index 314f57b7c..292be9138 100644 --- a/public/scripts/extensions/caption/index.js +++ b/public/scripts/extensions/caption/index.js @@ -1,5 +1,5 @@ import { getBase64Async } from "../../utils.js"; -import { getContext, getApiUrl } from "../../extensions.js"; +import { getContext, getApiUrl, doExtrasFetch } from "../../extensions.js"; export { MODULE_NAME }; const MODULE_NAME = 'caption'; @@ -63,7 +63,7 @@ async function onSelectImage(e) { const url = new URL(getApiUrl()); url.pathname = '/api/caption'; - const apiResult = await fetch(url, { + const apiResult = await doExtrasFetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/public/scripts/extensions/expressions/index.js b/public/scripts/extensions/expressions/index.js index 2ebbeaa10..8d81653cf 100644 --- a/public/scripts/extensions/expressions/index.js +++ b/public/scripts/extensions/expressions/index.js @@ -1,5 +1,5 @@ import { callPopup, getRequestHeaders, saveSettingsDebounced } from "../../../script.js"; -import { getContext, getApiUrl, modules, extension_settings, ModuleWorkerWrapper } from "../../extensions.js"; +import { getContext, getApiUrl, modules, extension_settings, ModuleWorkerWrapper, doExtrasFetch } from "../../extensions.js"; export { MODULE_NAME }; const MODULE_NAME = 'expressions'; @@ -122,7 +122,7 @@ async function moduleWorker() { const url = new URL(getApiUrl()); url.pathname = '/api/classify'; - const apiResult = await fetch(url, { + const apiResult = await doExtrasFetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -265,7 +265,7 @@ async function getExpressionsList() { url.pathname = '/api/classify/labels'; try { - const apiResult = await fetch(url, { + const apiResult = await doExtrasFetch(url, { method: 'GET', headers: { 'Bypass-Tunnel-Reminder': 'bypass' }, }); diff --git a/public/scripts/extensions/infinity-context/index.js b/public/scripts/extensions/infinity-context/index.js index 7901431db..c5a7fb995 100644 --- a/public/scripts/extensions/infinity-context/index.js +++ b/public/scripts/extensions/infinity-context/index.js @@ -1,6 +1,6 @@ import { saveSettingsDebounced, getCurrentChatId, system_message_types, eventSource, event_types } from "../../../script.js"; import { humanizedDateTime } from "../../RossAscends-mods.js"; -import { getApiUrl, extension_settings, getContext } from "../../extensions.js"; +import { getApiUrl, extension_settings, getContext, doExtrasFetch } from "../../extensions.js"; import { getFileText, onlyUnique, splitRecursive, IndexedDBStore } from "../../utils.js"; export { MODULE_NAME }; @@ -174,7 +174,7 @@ async function addMessages(chat_id, messages) { meta: JSON.stringify(m), })); - const addMessagesResult = await fetch(url, { + const addMessagesResult = await doExtrasFetch(url, { method: 'POST', headers: postHeaders, body: JSON.stringify({ chat_id, messages: transformedMessages }), @@ -222,7 +222,7 @@ async function onPurgeClick() { const url = new URL(getApiUrl()); url.pathname = '/api/chromadb/purge'; - const purgeResult = await fetch(url, { + const purgeResult = await doExtrasFetch(url, { method: 'POST', headers: postHeaders, body: JSON.stringify({ chat_id }), @@ -242,7 +242,7 @@ async function onExportClick() { const url = new URL(getApiUrl()); url.pathname = '/api/chromadb/export'; - const exportResult = await fetch(url, { + const exportResult = await doExtrasFetch(url, { method: 'POST', headers: postHeaders, body: JSON.stringify({ chat_id: currentChatId }), @@ -285,7 +285,7 @@ async function onSelectImportFile(e) { const url = new URL(getApiUrl()); url.pathname = '/api/chromadb/import'; - const importResult = await fetch(url, { + const importResult = await doExtrasFetch(url, { method: 'POST', headers: postHeaders, body: JSON.stringify(imported), @@ -313,7 +313,7 @@ async function queryMessages(chat_id, query) { const url = new URL(getApiUrl()); url.pathname = '/api/chromadb/query'; - const queryMessagesResult = await fetch(url, { + const queryMessagesResult = await doExtrasFetch(url, { method: 'POST', headers: postHeaders, body: JSON.stringify({ chat_id, query, n_results: extension_settings.chromadb.n_results }), @@ -366,7 +366,7 @@ async function onSelectInjectFile(e) { const url = new URL(getApiUrl()); url.pathname = '/api/chromadb'; - const addMessagesResult = await fetch(url, { + const addMessagesResult = await doExtrasFetch(url, { method: 'POST', headers: postHeaders, body: JSON.stringify({ chat_id: currentChatId, messages: messages }), diff --git a/public/scripts/extensions/memory/index.js b/public/scripts/extensions/memory/index.js index c58888710..99ed18742 100644 --- a/public/scripts/extensions/memory/index.js +++ b/public/scripts/extensions/memory/index.js @@ -1,5 +1,5 @@ import { getStringHash, debounce } from "../../utils.js"; -import { getContext, getApiUrl, extension_settings, ModuleWorkerWrapper } from "../../extensions.js"; +import { getContext, getApiUrl, extension_settings, ModuleWorkerWrapper, doExtrasFetch } from "../../extensions.js"; import { extension_prompt_types, is_send_press, saveSettingsDebounced } from "../../../script.js"; export { MODULE_NAME }; @@ -232,7 +232,7 @@ async function summarizeChat(context) { const url = new URL(getApiUrl()); url.pathname = '/api/summarize'; - const apiResult = await fetch(url, { + const apiResult = await doExtrasFetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/public/scripts/extensions/stable-diffusion/index.js b/public/scripts/extensions/stable-diffusion/index.js index 1e61f6cf0..413fba1b8 100644 --- a/public/scripts/extensions/stable-diffusion/index.js +++ b/public/scripts/extensions/stable-diffusion/index.js @@ -10,7 +10,7 @@ import { eventSource, appendImageToMessage } from "../../../script.js"; -import { getApiUrl, getContext, extension_settings, defaultRequestArgs, modules } from "../../extensions.js"; +import { getApiUrl, getContext, extension_settings, doExtrasFetch, modules } from "../../extensions.js"; import { stringFormat, initScrollHeight, resetScrollHeight } from "../../utils.js"; export { MODULE_NAME }; @@ -234,7 +234,7 @@ async function onModelChange() { async function updateExtrasRemoteModel() { const url = new URL(getApiUrl()); url.pathname = '/api/image/model'; - const getCurrentModelResult = await fetch(url, { + const getCurrentModelResult = await doExtrasFetch(url, { method: 'POST', headers: postHeaders, body: JSON.stringify({ model: extension_settings.sd.model }), @@ -285,7 +285,7 @@ async function loadExtrasSamplers() { const url = new URL(getApiUrl()); url.pathname = '/api/image/samplers'; - const result = await fetch(url, defaultRequestArgs); + const result = await doExtrasFetch(url); if (result.ok) { const data = await result.json(); @@ -338,7 +338,7 @@ async function loadExtrasModels() { const url = new URL(getApiUrl()); url.pathname = '/api/image/model'; - const getCurrentModelResult = await fetch(url, defaultRequestArgs); + const getCurrentModelResult = await doExtrasFetch(url); if (getCurrentModelResult.ok) { const data = await getCurrentModelResult.json(); @@ -346,7 +346,7 @@ async function loadExtrasModels() { } url.pathname = '/api/image/models'; - const getModelsResult = await fetch(url, defaultRequestArgs); + const getModelsResult = await doExtrasFetch(url); if (getModelsResult.ok) { const data = await getModelsResult.json(); @@ -493,7 +493,7 @@ async function generateExtrasImage(prompt, callback) { console.log(extension_settings.sd); const url = new URL(getApiUrl()); url.pathname = '/api/image'; - const result = await fetch(url, { + const result = await doExtrasFetch(url, { method: 'POST', headers: postHeaders, body: JSON.stringify({