mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging
This commit is contained in:
16
Dockerfile
16
Dockerfile
@ -23,18 +23,18 @@ COPY . ./
|
||||
|
||||
# Copy default chats, characters and user avatars to <folder>.default folder
|
||||
RUN \
|
||||
IFS="," RESOURCES="characters,chats,groups,group chats,User Avatars,worlds,OpenAI Settings,NovelAI Settings,KoboldAI Settings,TextGen Settings" && \
|
||||
IFS="," RESOURCES="assets,backgrounds,user,context,instruct,QuickReplies,movingUI,themes,characters,chats,groups,group chats,User Avatars,worlds,OpenAI Settings,NovelAI Settings,KoboldAI Settings,TextGen Settings" && \
|
||||
\
|
||||
echo "*** Store default $RESOURCES in <folder>.default ***" && \
|
||||
for R in $RESOURCES; do mv "public/$R" "public/$R.default"; done && \
|
||||
for R in $RESOURCES; do mv "public/$R" "public/$R.default"; done || true && \
|
||||
\
|
||||
echo "*** Create symbolic links to config directory ***" && \
|
||||
for R in $RESOURCES; do ln -s "../config/$R" "public/$R"; done && \
|
||||
# rm "config.conf" "public/settings.json" "public/css/bg_load.css" && \
|
||||
ln -s "./config/config.conf" "config.conf" && \
|
||||
ln -s "../config/settings.json" "public/settings.json" && \
|
||||
ln -s "../../config/bg_load.css" "public/css/bg_load.css" && \
|
||||
mkdir "config"
|
||||
for R in $RESOURCES; do ln -s "../config/$R" "public/$R"; done || true && \
|
||||
\
|
||||
ln -s "./config/config.conf" "config.conf" || true && \
|
||||
ln -s "../config/settings.json" "public/settings.json" || true && \
|
||||
ln -s "../../config/bg_load.css" "public/css/bg_load.css" || true && \
|
||||
mkdir "config" || true
|
||||
|
||||
# Cleanup unnecessary files
|
||||
RUN \
|
||||
|
@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Initialize missing user files
|
||||
IFS="," RESOURCES="characters,chats,groups,group chats,User Avatars,worlds,OpenAI Settings,NovelAI Settings,KoboldAI Settings,TextGen Settings"
|
||||
IFS="," RESOURCES="assets,backgrounds,user,context,instruct,QuickReplies,movingUI,themes,characters,chats,groups,group chats,User Avatars,worlds,OpenAI Settings,NovelAI Settings,KoboldAI Settings,TextGen Settings"
|
||||
for R in $RESOURCES; do
|
||||
if [ ! -e "config/$R" ]; then
|
||||
echo "Resource not found, copying from defaults: $R"
|
||||
@ -24,5 +24,17 @@ if [ ! -e "config/bg_load.css" ]; then
|
||||
cp -r "default/bg_load.css" "config/bg_load.css"
|
||||
fi
|
||||
|
||||
CONFIG_FILE="config.conf"
|
||||
|
||||
if grep -q "listen = false" $CONFIG_FILE; then
|
||||
echo -e "\033[1;31mThe listen parameter is set to false. If you can't connect to the server, edit the \"docker/config/config.conf\" file and restart the container.\033[0m"
|
||||
sleep 5
|
||||
fi
|
||||
|
||||
if grep -q "whitelistMode = true" $CONFIG_FILE; then
|
||||
echo -e "\033[1;31mThe whitelistMode parameter is set to true. If you can't connect to the server, edit the \"docker/config/config.conf\" file and restart the container.\033[0m"
|
||||
sleep 5
|
||||
fi
|
||||
|
||||
# Start the server
|
||||
exec node server.js
|
||||
|
@ -1618,7 +1618,7 @@
|
||||
oobabooga/text-generation-webui
|
||||
</a>
|
||||
<span data-i18n="Make sure you run it with">
|
||||
Make sure you run it with <tt>--extensions openai</tt> flag
|
||||
Make sure you run it with <tt>--api</tt> flag
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex1">
|
||||
|
@ -12,6 +12,7 @@ export const SECRET_KEYS = {
|
||||
AI21: 'api_key_ai21',
|
||||
SCALE_COOKIE: 'scale_cookie',
|
||||
PALM: 'api_key_palm',
|
||||
SERPAPI: 'api_key_serpapi',
|
||||
}
|
||||
|
||||
const INPUT_MAP = {
|
||||
|
@ -11,6 +11,7 @@ import {
|
||||
|
||||
import {
|
||||
power_user,
|
||||
registerDebugFunction,
|
||||
} from "./power-user.js";
|
||||
import { getTextTokens, tokenizers } from "./tokenizers.js";
|
||||
import { onlyUnique } from "./utils.js";
|
||||
@ -29,7 +30,10 @@ export const textgen_types = {
|
||||
};
|
||||
|
||||
// Maybe let it be configurable in the future?
|
||||
export const MANCER_SERVER = 'https://neuro.mancer.tech';
|
||||
// (7 days later) The future has come.
|
||||
const MANCER_SERVER_KEY = 'mancer_server';
|
||||
const MANCER_SERVER_DEFAULT = 'https://neuro.mancer.tech';
|
||||
export let MANCER_SERVER = localStorage.getItem(MANCER_SERVER_KEY) ?? MANCER_SERVER_DEFAULT;
|
||||
|
||||
const textgenerationwebui_settings = {
|
||||
temp: 0.7,
|
||||
@ -259,6 +263,15 @@ function loadTextGenSettings(data, settings) {
|
||||
$(this).show()
|
||||
})
|
||||
}
|
||||
|
||||
registerDebugFunction('change-mancer-url', 'Change Mancer base URL', 'Change Mancer API server base URL', () => {
|
||||
const result = prompt(`Enter Mancer base URL\nDefault: ${MANCER_SERVER_DEFAULT}`, MANCER_SERVER);
|
||||
|
||||
if (result) {
|
||||
localStorage.setItem(MANCER_SERVER_KEY, result);
|
||||
MANCER_SERVER = result;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function isMancer() {
|
||||
|
@ -3528,6 +3528,9 @@ require('./src/classify').registerEndpoints(app, jsonParser);
|
||||
// Image captioning
|
||||
require('./src/caption').registerEndpoints(app, jsonParser);
|
||||
|
||||
// Web search extension
|
||||
require('./src/serpapi').registerEndpoints(app, jsonParser);
|
||||
|
||||
const tavernUrl = new URL(
|
||||
(cliArguments.ssl ? 'https://' : 'http://') +
|
||||
(listen ? '0.0.0.0' : '127.0.0.1') +
|
||||
|
@ -94,7 +94,7 @@ function registerEndpoints(app, jsonParser) {
|
||||
//console.debug("FILE FOUND:",files)
|
||||
for (let file of files) {
|
||||
file = path.normalize(file.replace('public' + path.sep, ''));
|
||||
if (file.endsWith("model3.json")) {
|
||||
if (file.includes("model") && file.endsWith(".json")) {
|
||||
//console.debug("Asset live2d model found:",file)
|
||||
output[folder].push(path.normalize(path.join(file)));
|
||||
}
|
||||
@ -273,7 +273,7 @@ function registerEndpoints(app, jsonParser) {
|
||||
if (fs.statSync(live2dModelPath).isDirectory()) {
|
||||
for (let file of fs.readdirSync(live2dModelPath)) {
|
||||
//console.debug("Character live2d model found:", file)
|
||||
if (file.includes("model"))
|
||||
if (file.includes("model") && file.endsWith(".json"))
|
||||
output.push(path.join("characters", name, category, modelFolder, file));
|
||||
}
|
||||
}
|
||||
|
@ -21,6 +21,7 @@ const SECRET_KEYS = {
|
||||
ONERING_URL: 'oneringtranslator_url',
|
||||
DEEPLX_URL: 'deeplx_url',
|
||||
PALM: 'api_key_palm',
|
||||
SERPAPI: 'api_key_serpapi',
|
||||
}
|
||||
|
||||
/**
|
||||
|
39
src/serpapi.js
Normal file
39
src/serpapi.js
Normal file
@ -0,0 +1,39 @@
|
||||
const fetch = require('node-fetch').default;
|
||||
const { readSecret } = require('./secrets');
|
||||
|
||||
/**
|
||||
* Registers the SerpApi endpoints.
|
||||
* @param {import("express").Express} app
|
||||
* @param {any} jsonParser
|
||||
*/
|
||||
function registerEndpoints(app, jsonParser) {
|
||||
app.post('/api/serpapi/search', jsonParser, async (request, response) => {
|
||||
try {
|
||||
const key = readSecret('serpapi_key');
|
||||
|
||||
if (!key) {
|
||||
console.log('No SerpApi key found');
|
||||
return response.sendStatus(401);
|
||||
}
|
||||
|
||||
const { query } = request.body;
|
||||
const result = await fetch(`https://serpapi.com/search.json?q=${encodeURIComponent(query)}&api_key=${key}`);
|
||||
|
||||
if (!result.ok) {
|
||||
const text = await result.text();
|
||||
console.log('SerpApi request failed', result.statusText, text);
|
||||
return response.status(500).send(text);
|
||||
}
|
||||
|
||||
const data = await result.json();
|
||||
return response.json(data);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return response.sendStatus(500);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
registerEndpoints,
|
||||
};
|
Reference in New Issue
Block a user