mirror of
				https://github.com/SillyTavern/SillyTavern.git
				synced 2025-06-05 21:59:27 +02:00 
			
		
		
		
	lint: Require semicolons
This commit is contained in:
		
							
								
								
									
										88
									
								
								server.js
									
									
									
									
									
								
							
							
						
						
									
										88
									
								
								server.js
									
									
									
									
									
								
							@@ -153,7 +153,7 @@ function getAphroditeHeaders() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getTabbyHeaders() {
 | 
			
		||||
    const apiKey = readSecret(SECRET_KEYS.TABBY)
 | 
			
		||||
    const apiKey = readSecret(SECRET_KEYS.TABBY);
 | 
			
		||||
 | 
			
		||||
    return apiKey ? ({
 | 
			
		||||
        'x-api-key': apiKey,
 | 
			
		||||
@@ -393,7 +393,7 @@ app.get('/deviceinfo', function (request, response) {
 | 
			
		||||
app.get('/version', async function (_, response) {
 | 
			
		||||
    const data = await getVersion();
 | 
			
		||||
    response.send(data);
 | 
			
		||||
})
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
//**************Kobold api
 | 
			
		||||
app.post('/generate', jsonParser, async function (request, response_generate) {
 | 
			
		||||
@@ -574,7 +574,7 @@ app.post('/api/textgenerationwebui/status', jsonParser, async function (request,
 | 
			
		||||
            url += '/oai/v1/models';
 | 
			
		||||
        }
 | 
			
		||||
        else if (request.body.use_tabby) {
 | 
			
		||||
            url += '/v1/model/list'
 | 
			
		||||
            url += '/v1/model/list';
 | 
			
		||||
        }
 | 
			
		||||
        else if (request.body.use_koboldcpp) {
 | 
			
		||||
            url += '/v1/models';
 | 
			
		||||
@@ -595,7 +595,7 @@ app.post('/api/textgenerationwebui/status', jsonParser, async function (request,
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!Array.isArray(data.data)) {
 | 
			
		||||
            console.log('Models response is not an array.')
 | 
			
		||||
            console.log('Models response is not an array.');
 | 
			
		||||
            return response.status(400);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -636,7 +636,7 @@ app.post('/api/textgenerationwebui/status', jsonParser, async function (request,
 | 
			
		||||
                } else {
 | 
			
		||||
                    // TabbyAPI returns an error 400 if a model isn't loaded
 | 
			
		||||
 | 
			
		||||
                    result = 'None'
 | 
			
		||||
                    result = 'None';
 | 
			
		||||
                }
 | 
			
		||||
            } catch (error) {
 | 
			
		||||
                console.error(`Failed to get TabbyAPI model info: ${error}`);
 | 
			
		||||
@@ -748,7 +748,7 @@ app.post('/savechat', jsonParser, function (request, response) {
 | 
			
		||||
        let chat_data = request.body.chat;
 | 
			
		||||
        let jsonlData = chat_data.map(JSON.stringify).join('\n');
 | 
			
		||||
        writeFileAtomicSync(`${chatsPath + sanitize(dir_name)}/${sanitize(String(request.body.file_name))}.jsonl`, jsonlData, 'utf8');
 | 
			
		||||
        backupChat(dir_name, jsonlData)
 | 
			
		||||
        backupChat(dir_name, jsonlData);
 | 
			
		||||
        return response.send({ result: 'ok' });
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
        response.send(error);
 | 
			
		||||
@@ -811,7 +811,7 @@ app.post('/getstatus', jsonParser, async function (request, response) {
 | 
			
		||||
 | 
			
		||||
    if (request.body.main_api == 'kobold') {
 | 
			
		||||
        try {
 | 
			
		||||
            version = (await fetchJSON(api_server + '/v1/info/version')).result
 | 
			
		||||
            version = (await fetchJSON(api_server + '/v1/info/version')).result;
 | 
			
		||||
        }
 | 
			
		||||
        catch {
 | 
			
		||||
            version = '0.0.0';
 | 
			
		||||
@@ -946,10 +946,10 @@ function charaFormatData(data) {
 | 
			
		||||
 | 
			
		||||
    // Checks if data.alternate_greetings is an array, a string, or neither, and acts accordingly. (expected to be an array of strings)
 | 
			
		||||
    const getAlternateGreetings = data => {
 | 
			
		||||
        if (Array.isArray(data.alternate_greetings)) return data.alternate_greetings
 | 
			
		||||
        if (typeof data.alternate_greetings === 'string') return [data.alternate_greetings]
 | 
			
		||||
        return []
 | 
			
		||||
    }
 | 
			
		||||
        if (Array.isArray(data.alternate_greetings)) return data.alternate_greetings;
 | 
			
		||||
        if (typeof data.alternate_greetings === 'string') return [data.alternate_greetings];
 | 
			
		||||
        return [];
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // Spec V1 fields
 | 
			
		||||
    _.set(char, 'name', data.ch_name);
 | 
			
		||||
@@ -1179,7 +1179,7 @@ app.post('/editcharacterattribute', jsonParser, async function (request, respons
 | 
			
		||||
        let charJSON = await charaRead(avatarPath);
 | 
			
		||||
        if (typeof charJSON !== 'string') throw new Error('Failed to read character file');
 | 
			
		||||
 | 
			
		||||
        let char = JSON.parse(charJSON)
 | 
			
		||||
        let char = JSON.parse(charJSON);
 | 
			
		||||
        //check if the field exists
 | 
			
		||||
        if (char[request.body.field] === undefined && char.data[request.body.field] === undefined) {
 | 
			
		||||
            console.error('Error: invalid field.');
 | 
			
		||||
@@ -1226,7 +1226,7 @@ app.post('/v2/editcharacterattribute', jsonParser, async function (request, resp
 | 
			
		||||
                'Character saved'
 | 
			
		||||
            );
 | 
			
		||||
        } else {
 | 
			
		||||
            console.log(validator.lastValidationError)
 | 
			
		||||
            console.log(validator.lastValidationError);
 | 
			
		||||
            response.status(400).send({ message: `Validation failed for ${character.name}`, error: validator.lastValidationError });
 | 
			
		||||
        }
 | 
			
		||||
    } catch (exception) {
 | 
			
		||||
@@ -1260,7 +1260,7 @@ app.post('/deletecharacter', jsonParser, async function (request, response) {
 | 
			
		||||
 | 
			
		||||
    if (request.body.delete_chats == true) {
 | 
			
		||||
        try {
 | 
			
		||||
            await fs.promises.rm(path.join(chatsPath, sanitize(dir_name)), { recursive: true, force: true })
 | 
			
		||||
            await fs.promises.rm(path.join(chatsPath, sanitize(dir_name)), { recursive: true, force: true });
 | 
			
		||||
        } catch (err) {
 | 
			
		||||
            console.error(err);
 | 
			
		||||
            return response.sendStatus(500);
 | 
			
		||||
@@ -1305,15 +1305,15 @@ async function charaWrite(img_url, data, target_img, response = undefined, mes =
 | 
			
		||||
async function tryReadImage(img_url, crop) {
 | 
			
		||||
    try {
 | 
			
		||||
        let rawImg = await jimp.read(img_url);
 | 
			
		||||
        let final_width = rawImg.bitmap.width, final_height = rawImg.bitmap.height
 | 
			
		||||
        let final_width = rawImg.bitmap.width, final_height = rawImg.bitmap.height;
 | 
			
		||||
 | 
			
		||||
        // Apply crop if defined
 | 
			
		||||
        if (typeof crop == 'object' && [crop.x, crop.y, crop.width, crop.height].every(x => typeof x === 'number')) {
 | 
			
		||||
            rawImg = rawImg.crop(crop.x, crop.y, crop.width, crop.height);
 | 
			
		||||
            // Apply standard resize if requested
 | 
			
		||||
            if (crop.want_resize) {
 | 
			
		||||
                final_width = AVATAR_WIDTH
 | 
			
		||||
                final_height = AVATAR_HEIGHT
 | 
			
		||||
                final_width = AVATAR_WIDTH;
 | 
			
		||||
                final_height = AVATAR_HEIGHT;
 | 
			
		||||
            } else {
 | 
			
		||||
                final_width = crop.width;
 | 
			
		||||
                final_height = crop.height;
 | 
			
		||||
@@ -1355,12 +1355,12 @@ const calculateChatSize = (charDir) => {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return { chatSize, dateLastChat };
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Calculate the total string length of the data object
 | 
			
		||||
const calculateDataSize = (data) => {
 | 
			
		||||
    return typeof data === 'object' ? Object.values(data).reduce((acc, val) => acc + new String(val).length, 0) : 0;
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * processCharacter - Process a given character, read its data and calculate its statistics.
 | 
			
		||||
@@ -1403,7 +1403,7 @@ const processCharacter = async (item, i) => {
 | 
			
		||||
            console.log('An unexpected error occurred: ', err);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -1712,7 +1712,7 @@ function readPresetsFromDirectory(directoryPath, options = {}) {
 | 
			
		||||
 | 
			
		||||
// Wintermute's code
 | 
			
		||||
app.post('/getsettings', jsonParser, (request, response) => {
 | 
			
		||||
    let settings
 | 
			
		||||
    let settings;
 | 
			
		||||
    try {
 | 
			
		||||
        settings = fs.readFileSync('public/settings.json', 'utf8');
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
@@ -1742,7 +1742,7 @@ app.post('/getsettings', jsonParser, (request, response) => {
 | 
			
		||||
    const { fileContents: koboldai_settings, fileNames: koboldai_setting_names }
 | 
			
		||||
        = readPresetsFromDirectory(DIRECTORIES.koboldAI_Settings, {
 | 
			
		||||
            sortFunction: sortByName(DIRECTORIES.koboldAI_Settings), removeFileExtension: true
 | 
			
		||||
        })
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
    const worldFiles = fs
 | 
			
		||||
        .readdirSync(DIRECTORIES.worlds)
 | 
			
		||||
@@ -2184,11 +2184,11 @@ app.post('/exportchat', jsonParser, async function (request, response) {
 | 
			
		||||
        ? DIRECTORIES.groupChats
 | 
			
		||||
        : path.join(DIRECTORIES.chats, String(request.body.avatar_url).replace('.png', ''));
 | 
			
		||||
    let filename = path.join(pathToFolder, request.body.file);
 | 
			
		||||
    let exportfilename = request.body.exportfilename
 | 
			
		||||
    let exportfilename = request.body.exportfilename;
 | 
			
		||||
    if (!fs.existsSync(filename)) {
 | 
			
		||||
        const errorMessage = {
 | 
			
		||||
            message: `Could not find JSONL file to export. Source chat file: ${filename}.`
 | 
			
		||||
        }
 | 
			
		||||
        };
 | 
			
		||||
        console.log(errorMessage.message);
 | 
			
		||||
        return response.status(404).json(errorMessage);
 | 
			
		||||
    }
 | 
			
		||||
@@ -2200,7 +2200,7 @@ app.post('/exportchat', jsonParser, async function (request, response) {
 | 
			
		||||
                const successMessage = {
 | 
			
		||||
                    message: `Chat saved to ${exportfilename}`,
 | 
			
		||||
                    result: rawFile,
 | 
			
		||||
                }
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                console.log(`Chat exported as ${exportfilename}`);
 | 
			
		||||
                return response.status(200).json(successMessage);
 | 
			
		||||
@@ -2209,7 +2209,7 @@ app.post('/exportchat', jsonParser, async function (request, response) {
 | 
			
		||||
                console.error(err);
 | 
			
		||||
                const errorMessage = {
 | 
			
		||||
                    message: `Could not read JSONL file to export. Source chat file: ${filename}.`
 | 
			
		||||
                }
 | 
			
		||||
                };
 | 
			
		||||
                console.log(errorMessage.message);
 | 
			
		||||
                return response.status(500).json(errorMessage);
 | 
			
		||||
            }
 | 
			
		||||
@@ -2232,17 +2232,17 @@ app.post('/exportchat', jsonParser, async function (request, response) {
 | 
			
		||||
            const successMessage = {
 | 
			
		||||
                message: `Chat saved to ${exportfilename}`,
 | 
			
		||||
                result: buffer,
 | 
			
		||||
            }
 | 
			
		||||
            };
 | 
			
		||||
            console.log(`Chat exported as ${exportfilename}`);
 | 
			
		||||
            return response.status(200).json(successMessage);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    catch (err) {
 | 
			
		||||
        console.log('chat export failed.')
 | 
			
		||||
        console.log('chat export failed.');
 | 
			
		||||
        console.log(err);
 | 
			
		||||
        return response.sendStatus(400);
 | 
			
		||||
    }
 | 
			
		||||
})
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
app.post('/exportcharacter', jsonParser, async function (request, response) {
 | 
			
		||||
    if (!request.body.format || !request.body.avatar_url) {
 | 
			
		||||
@@ -2263,7 +2263,7 @@ app.post('/exportcharacter', jsonParser, async function (request, response) {
 | 
			
		||||
                let json = await charaRead(filename);
 | 
			
		||||
                if (json === undefined) return response.sendStatus(400);
 | 
			
		||||
                let jsonObject = getCharaCardV2(json5.parse(json));
 | 
			
		||||
                return response.type('json').send(jsonObject)
 | 
			
		||||
                return response.type('json').send(jsonObject);
 | 
			
		||||
            }
 | 
			
		||||
            catch {
 | 
			
		||||
                return response.sendStatus(400);
 | 
			
		||||
@@ -2331,7 +2331,7 @@ app.post('/importchat', urlencodedParser, function (request, response) {
 | 
			
		||||
                                })
 | 
			
		||||
                            )];
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                const newChats = [];
 | 
			
		||||
                (jsonData.histories.histories ?? []).forEach((history) => {
 | 
			
		||||
@@ -2835,7 +2835,7 @@ app.post('/getstatus_openai', jsonParser, async function (request, response_gets
 | 
			
		||||
                    const modelIds = models.filter(x => x && typeof x === 'object').map(x => x.id).sort();
 | 
			
		||||
                    console.log('Available OpenAI models:', modelIds);
 | 
			
		||||
                } else {
 | 
			
		||||
                    console.log('OpenAI endpoint did not return a list of models.')
 | 
			
		||||
                    console.log('OpenAI endpoint did not return a list of models.');
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -3049,12 +3049,12 @@ app.post('/generate_altscale', jsonParser, function (request, response_generate_
 | 
			
		||||
    })
 | 
			
		||||
        .then(response => response.json())
 | 
			
		||||
        .then(data => {
 | 
			
		||||
            console.log(data.result.data.json.outputs[0])
 | 
			
		||||
            console.log(data.result.data.json.outputs[0]);
 | 
			
		||||
            return response_generate_scale.send({ output: data.result.data.json.outputs[0] });
 | 
			
		||||
        })
 | 
			
		||||
        .catch((error) => {
 | 
			
		||||
            console.error('Error:', error)
 | 
			
		||||
            return response_generate_scale.send({ error: true })
 | 
			
		||||
            console.error('Error:', error);
 | 
			
		||||
            return response_generate_scale.send({ error: true });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
@@ -3332,7 +3332,7 @@ app.post('/generate_openai', jsonParser, function (request, response_generate_op
 | 
			
		||||
     */
 | 
			
		||||
    async function makeRequest(config, response_generate_openai, request, retries = 5, timeout = 5000) {
 | 
			
		||||
        try {
 | 
			
		||||
            const fetchResponse = await fetch(endpointUrl, config)
 | 
			
		||||
            const fetchResponse = await fetch(endpointUrl, config);
 | 
			
		||||
 | 
			
		||||
            if (fetchResponse.ok) {
 | 
			
		||||
                if (request.body.stream) {
 | 
			
		||||
@@ -3343,7 +3343,7 @@ app.post('/generate_openai', jsonParser, function (request, response_generate_op
 | 
			
		||||
                        response_generate_openai.end();
 | 
			
		||||
                    });
 | 
			
		||||
                } else {
 | 
			
		||||
                    let json = await fetchResponse.json()
 | 
			
		||||
                    let json = await fetchResponse.json();
 | 
			
		||||
                    response_generate_openai.send(json);
 | 
			
		||||
                    console.log(json);
 | 
			
		||||
                    console.log(json?.choices[0]?.message);
 | 
			
		||||
@@ -3399,7 +3399,7 @@ app.post('/generate_openai', jsonParser, function (request, response_generate_op
 | 
			
		||||
async function sendAI21Request(request, response) {
 | 
			
		||||
    if (!request.body) return response.sendStatus(400);
 | 
			
		||||
    const controller = new AbortController();
 | 
			
		||||
    console.log(request.body.messages)
 | 
			
		||||
    console.log(request.body.messages);
 | 
			
		||||
    request.socket.removeAllListeners('close');
 | 
			
		||||
    request.socket.on('close', function () {
 | 
			
		||||
        controller.abort();
 | 
			
		||||
@@ -3452,16 +3452,16 @@ async function sendAI21Request(request, response) {
 | 
			
		||||
        .then(r => r.json())
 | 
			
		||||
        .then(r => {
 | 
			
		||||
            if (r.completions === undefined) {
 | 
			
		||||
                console.log(r)
 | 
			
		||||
                console.log(r);
 | 
			
		||||
            } else {
 | 
			
		||||
                console.log(r.completions[0].data.text)
 | 
			
		||||
                console.log(r.completions[0].data.text);
 | 
			
		||||
            }
 | 
			
		||||
            const reply = { choices: [{ 'message': { 'content': r.completions[0].data.text, } }] };
 | 
			
		||||
            return response.send(reply)
 | 
			
		||||
            return response.send(reply);
 | 
			
		||||
        })
 | 
			
		||||
        .catch(err => {
 | 
			
		||||
            console.error(err)
 | 
			
		||||
            return response.send({ error: true })
 | 
			
		||||
            console.error(err);
 | 
			
		||||
            return response.send({ error: true });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -3668,7 +3668,7 @@ const setupTasks = async function () {
 | 
			
		||||
    if (listen) {
 | 
			
		||||
        console.log('\n0.0.0.0 means SillyTavern is listening on all network interfaces (Wi-Fi, LAN, localhost). If you want to limit it only to internal localhost (127.0.0.1), change the setting in config.yaml to "listen: false". Check "access.log" file in the SillyTavern directory if you want to inspect incoming connections.\n');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
if (listen && !getConfigValue('whitelistMode', true) && !getConfigValue('basicAuthMode', false)) {
 | 
			
		||||
    if (getConfigValue('securityOverride', false)) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user