From f29f934c6bf4c5cc358a6516c9dfe5a199a6e56b Mon Sep 17 00:00:00 2001 From: NWilson Date: Wed, 24 Jan 2024 06:59:27 -0600 Subject: [PATCH] Progress --- public/index.html | 21 +++++++- public/script.js | 17 ++++++- public/scripts/RossAscends-mods.js | 1 + public/scripts/secrets.js | 2 + public/scripts/textgen-models.js | 57 ++++++++++++++++++++++ public/scripts/textgen-settings.js | 17 +++++-- src/additional-headers.js | 11 +++++ src/constants.js | 10 ++++ src/endpoints/backends/text-completions.js | 8 ++- 9 files changed, 137 insertions(+), 7 deletions(-) diff --git a/public/index.html b/public/index.html index cc468feae..64de8e586 100644 --- a/public/index.html +++ b/public/index.html @@ -1848,6 +1848,7 @@ +
@@ -1868,6 +1869,24 @@
+
+

InfermaticAI API Key

+
+ + +
+
+ For privacy reasons, your API key will be hidden after you reload the page. +
+
+

InfermaticAI Model

+ +
+
@@ -5235,4 +5254,4 @@ - \ No newline at end of file + diff --git a/public/script.js b/public/script.js index 571b95d2f..bff268e5a 100644 --- a/public/script.js +++ b/public/script.js @@ -20,7 +20,7 @@ import { validateTextGenUrl, } from './scripts/textgen-settings.js'; -const { MANCER, TOGETHERAI, OOBA, APHRODITE, OLLAMA } = textgen_types; +const { MANCER, TOGETHERAI, OOBA, APHRODITE, OLLAMA, INFERMATICAI } = textgen_types; import { world_info, @@ -185,7 +185,7 @@ import { createPersona, initPersonas, selectCurrentPersona, setPersonaDescriptio import { getBackgrounds, initBackgrounds, loadBackgroundSettings, background_settings } from './scripts/backgrounds.js'; import { hideLoader, showLoader } from './scripts/loader.js'; import { BulkEditOverlay, CharacterContextMenu } from './scripts/BulkEditOverlay.js'; -import { loadMancerModels, loadOllamaModels, loadTogetherAIModels } from './scripts/textgen-models.js'; +import { loadMancerModels, loadOllamaModels, loadTogetherAIModels, loadInfermaticAIModels } from './scripts/textgen-models.js'; import { appendFileContent, hasPendingFileAttachment, populateFileAttachment, decodeStyleTags, encodeStyleTags } from './scripts/chats.js'; import { initPresetManager } from './scripts/preset-manager.js'; import { evaluateMacros } from './scripts/macros.js'; @@ -988,6 +988,9 @@ async function getStatusTextgen() { } else if (textgen_settings.type === OLLAMA) { loadOllamaModels(data?.data); online_status = textgen_settings.ollama_model || 'Connected'; + } else if (textgen_settings.type === INFERMATICAI) { + loadInfermaticAIModels(data?.data); + online_status = textgen_settings.infermaticai_model; } else { online_status = data?.result; } @@ -7399,6 +7402,11 @@ const CONNECT_API_MAP = { button: '#api_button_openai', source: chat_completion_sources.CUSTOM, }, + 'infermaticai': { + selected: 'openai', + button: '#api_button_openai', + type: textgen_types.INFERMATICAI, + }, }; /** @@ -8246,6 +8254,11 @@ jQuery(async function () { await writeSecret(SECRET_KEYS.TOGETHERAI, togetherKey); } + const infermaticAIKey = String($('#api_key_infermaticai').val()).trim(); + if (infermaticAIKey.length) { + await writeSecret(SECRET_KEYS.INFERMATICAI, infermaticAIKey); + } + validateTextGenUrl(); startStatusLoading(); main_api = 'textgenerationwebui'; diff --git a/public/scripts/RossAscends-mods.js b/public/scripts/RossAscends-mods.js index 7b76ba010..3284e6a6c 100644 --- a/public/scripts/RossAscends-mods.js +++ b/public/scripts/RossAscends-mods.js @@ -397,6 +397,7 @@ function RA_autoconnect(PrevApi) { || (secret_state[SECRET_KEYS.AI21] && oai_settings.chat_completion_source == chat_completion_sources.AI21) || (secret_state[SECRET_KEYS.MAKERSUITE] && oai_settings.chat_completion_source == chat_completion_sources.MAKERSUITE) || (secret_state[SECRET_KEYS.MISTRALAI] && oai_settings.chat_completion_source == chat_completion_sources.MISTRALAI) + || (secret_state[SECRET_KEYS.INFERMATICAI] && oai_settings.chat_completion_source == chat_completion_sources.INFERMATICAI) || (isValidUrl(oai_settings.custom_url) && oai_settings.chat_completion_source == chat_completion_sources.CUSTOM) ) { $('#api_button_openai').trigger('click'); diff --git a/public/scripts/secrets.js b/public/scripts/secrets.js index 1c1154180..2a67e497b 100644 --- a/public/scripts/secrets.js +++ b/public/scripts/secrets.js @@ -16,6 +16,7 @@ export const SECRET_KEYS = { SERPAPI: 'api_key_serpapi', MISTRALAI: 'api_key_mistralai', TOGETHERAI: 'api_key_togetherai', + INFERMATICAI: 'api_key_infermaticai', CUSTOM: 'api_key_custom', }; @@ -35,6 +36,7 @@ const INPUT_MAP = { [SECRET_KEYS.MISTRALAI]: '#api_key_mistralai', [SECRET_KEYS.CUSTOM]: '#api_key_custom', [SECRET_KEYS.TOGETHERAI]: '#api_key_togetherai', + [SECRET_KEYS.INFERMATICAI]: '#api_key_infermaticai', }; async function clearSecret() { diff --git a/public/scripts/textgen-models.js b/public/scripts/textgen-models.js index c828f6404..ca9c53c77 100644 --- a/public/scripts/textgen-models.js +++ b/public/scripts/textgen-models.js @@ -4,6 +4,7 @@ import { textgenerationwebui_settings as textgen_settings, textgen_types } from let mancerModels = []; let togetherModels = []; +let infermaticAIModels = []; export async function loadOllamaModels(data) { if (!Array.isArray(data)) { @@ -52,6 +53,32 @@ export async function loadTogetherAIModels(data) { } } +export async function loadInfermaticAIModels(data) { + if (!Array.isArray(data)) { + console.error('Invalid Infermatic AI models data', data); + return; + } + + infermaticAIModels = data; + + if (!data.find(x => x.id === textgen_settings.infermaticai_model)) { + textgen_settings.infermaticai_model = data[0]?.id || ''; + } + + $('#model_infermaticai_select').empty(); + for (const model of data) { + if (model.display_type === 'image') { + continue; + } + + const option = document.createElement('option'); + option.value = model.id; + option.text = model.id; + option.selected = model.id === textgen_settings.infermaticai_model; + $('#model_infermaticai_select').append(option); + } +} + export async function loadMancerModels(data) { if (!Array.isArray(data)) { console.error('Invalid Mancer models data', data); @@ -91,6 +118,14 @@ function onTogetherModelSelect() { setGenerationParamsFromPreset({ max_length: model.context_length }); } +function onInfermaticAIModelSelect() { + const modelName = String($('#model_infermaticai_select').val()); + textgen_settings.infermaticai_model = modelName; + $('#api_button_openai').trigger('click'); + const model = infermaticAIModels.find(x => x.id === modelName); + setGenerationParamsFromPreset({ max_length: model.context_length }); +} + function onOllamaModelSelect() { const modelId = String($('#ollama_model').val()); textgen_settings.ollama_model = modelId; @@ -130,6 +165,20 @@ function getTogetherModelTemplate(option) { `)); } +function getInfermaticAIModelTemplate(option) { + const model = infermaticAIModels.find(x => x.id === option?.element?.value); + + if (!option.id || !model) { + return option.text; + } + + return $((` +
+
${DOMPurify.sanitize(model.id)}
+
+ `)); +} + async function downloadOllamaModel() { try { const serverUrl = textgen_settings.server_urls[textgen_types.OLLAMA]; @@ -174,6 +223,7 @@ async function downloadOllamaModel() { jQuery(function () { $('#mancer_model').on('change', onMancerModelSelect); $('#model_togetherai_select').on('change', onTogetherModelSelect); + $('#model_infermaticai_select').on('change', onInfermaticAIModelSelect); $('#ollama_model').on('change', onOllamaModelSelect); $('#ollama_download_model').on('click', downloadOllamaModel); @@ -198,5 +248,12 @@ jQuery(function () { searchInputCssClass: 'text_pole', width: '100%', }); + $('#model_infermaticai_select').select2({ + placeholder: 'Select a model', + searchInputPlaceholder: 'Search models...', + searchInputCssClass: 'text_pole', + width: '100%', + templateResult: getInfermaticAIModelTemplate, + }); } }); diff --git a/public/scripts/textgen-settings.js b/public/scripts/textgen-settings.js index 51b08538d..eb8227095 100644 --- a/public/scripts/textgen-settings.js +++ b/public/scripts/textgen-settings.js @@ -34,9 +34,10 @@ export const textgen_types = { TOGETHERAI: 'togetherai', LLAMACPP: 'llamacpp', OLLAMA: 'ollama', + INFERMATICAI: 'infermaticai', }; -const { MANCER, APHRODITE, TOGETHERAI, OOBA, OLLAMA, LLAMACPP } = textgen_types; +const { MANCER, APHRODITE, TOGETHERAI, OOBA, OLLAMA, LLAMACPP, INFERMATICAI } = textgen_types; const BIAS_KEY = '#textgenerationwebui_api-settings'; // Maybe let it be configurable in the future? @@ -45,6 +46,7 @@ const MANCER_SERVER_KEY = 'mancer_server'; const MANCER_SERVER_DEFAULT = 'https://neuro.mancer.tech'; let MANCER_SERVER = localStorage.getItem(MANCER_SERVER_KEY) ?? MANCER_SERVER_DEFAULT; let TOGETHERAI_SERVER = 'https://api.together.xyz'; +let INFERMATICAI_SERVER = 'https://api.totalgpt.ai'; const SERVER_INPUTS = { [textgen_types.OOBA]: '#textgenerationwebui_api_url_text', @@ -107,6 +109,7 @@ const settings = { type: textgen_types.OOBA, mancer_model: 'mytholite', togetherai_model: 'Gryphe/MythoMax-L2-13b', + infermaticai_model: '', ollama_model: '', legacy_api: false, sampler_order: KOBOLDCPP_ORDER, @@ -203,6 +206,10 @@ export function getTextGenServer() { return TOGETHERAI_SERVER; } + if (settings.type === INFERMATICAI) { + return INFERMATICAI_SERVER; + } + return settings.server_urls[settings.type] ?? ''; } @@ -226,8 +233,8 @@ async function selectPreset(name) { function formatTextGenURL(value) { try { - // Mancer/Together doesn't need any formatting (it's hardcoded) - if (settings.type === MANCER || settings.type === TOGETHERAI) { + // Mancer/Together/InfermaticAI doesn't need any formatting (it's hardcoded) + if (settings.type === MANCER || settings.type === TOGETHERAI || settings.type === INFERMATICAI) { return value; } @@ -746,6 +753,10 @@ function getModel() { return settings.togetherai_model; } + if (settings.type === INFERMATICAI) { + return settings.infermaticai_model; + } + if (settings.type === APHRODITE) { return online_status; } diff --git a/src/additional-headers.js b/src/additional-headers.js index de8b0d91a..a78c71fd3 100644 --- a/src/additional-headers.js +++ b/src/additional-headers.js @@ -19,6 +19,14 @@ function getTogetherAIHeaders() { }) : {}; } +function getInfermaticAIHeaders() { + const apiKey = readSecret(SECRET_KEYS.INFERMATICAI); + + return apiKey ? ({ + 'Authorization': `Bearer ${apiKey}`, + }) : {}; +} + function getAphroditeHeaders() { const apiKey = readSecret(SECRET_KEYS.APHRODITE); @@ -69,6 +77,9 @@ function setAdditionalHeaders(request, args, server) { case TEXTGEN_TYPES.TOGETHERAI: headers = getTogetherAIHeaders(); break; + case TEXTGEN_TYPES.INFERMATICAI: + headers = getInfermaticAIHeaders(); + break; default: headers = server ? getOverrideHeaders((new URL(server))?.host) : {}; break; diff --git a/src/constants.js b/src/constants.js index 80b7585b2..13c1fc410 100644 --- a/src/constants.js +++ b/src/constants.js @@ -175,8 +175,17 @@ const TEXTGEN_TYPES = { TOGETHERAI: 'togetherai', LLAMACPP: 'llamacpp', OLLAMA: 'ollama', + INFERMATICAI: 'infermaticai', }; +const INFERMATICAI_KEYS = [ + 'model', + 'max_tokens', + 'temperature', + 'repetition_penalty', + 'stream', +]; + // https://docs.together.ai/reference/completions const TOGETHERAI_KEYS = [ 'model', @@ -223,4 +232,5 @@ module.exports = { AVATAR_HEIGHT, TOGETHERAI_KEYS, OLLAMA_KEYS, + INFERMATICAI_KEYS, }; diff --git a/src/endpoints/backends/text-completions.js b/src/endpoints/backends/text-completions.js index f1ef4004d..d4f44978b 100644 --- a/src/endpoints/backends/text-completions.js +++ b/src/endpoints/backends/text-completions.js @@ -4,7 +4,7 @@ const _ = require('lodash'); const Readable = require('stream').Readable; const { jsonParser } = require('../../express-common'); -const { TEXTGEN_TYPES, TOGETHERAI_KEYS, OLLAMA_KEYS } = require('../../constants'); +const { TEXTGEN_TYPES, TOGETHERAI_KEYS, OLLAMA_KEYS, INFERMATICAI_KEYS } = require('../../constants'); const { forwardFetchResponse, trimV1 } = require('../../util'); const { setAdditionalHeaders } = require('../../additional-headers'); @@ -117,6 +117,9 @@ router.post('/status', jsonParser, async function (request, response) { case TEXTGEN_TYPES.TOGETHERAI: url += '/api/models?&info'; break; + case TEXTGEN_TYPES.INFERMATICAI: + url += '/models'; + break; case TEXTGEN_TYPES.OLLAMA: url += '/api/tags'; break; @@ -243,6 +246,9 @@ router.post('/generate', jsonParser, async function (request, response) { case TEXTGEN_TYPES.OLLAMA: url += '/api/generate'; break; + case TEXTGEN_TYPES.INFERMATICAI: + url += '/completions'; + break; } }