[chore] Fix type errors

This commit is contained in:
Cohee
2024-10-11 21:33:36 +03:00
parent 72138c632d
commit 4fcad0752f
25 changed files with 78 additions and 44 deletions

1
package-lock.json generated
View File

@ -71,7 +71,6 @@
"@types/lodash": "^4.17.10", "@types/lodash": "^4.17.10",
"@types/mime-types": "^2.1.4", "@types/mime-types": "^2.1.4",
"@types/multer": "^1.4.12", "@types/multer": "^1.4.12",
"@types/node-fetch": "^2.6.11",
"@types/node-persist": "^3.1.8", "@types/node-persist": "^3.1.8",
"@types/png-chunk-text": "^1.0.3", "@types/png-chunk-text": "^1.0.3",
"@types/png-chunks-encode": "^1.0.2", "@types/png-chunks-encode": "^1.0.2",

View File

@ -97,7 +97,6 @@
"@types/lodash": "^4.17.10", "@types/lodash": "^4.17.10",
"@types/mime-types": "^2.1.4", "@types/mime-types": "^2.1.4",
"@types/multer": "^1.4.12", "@types/multer": "^1.4.12",
"@types/node-fetch": "^2.6.11",
"@types/node-persist": "^3.1.8", "@types/node-persist": "^3.1.8",
"@types/png-chunk-text": "^1.0.3", "@types/png-chunk-text": "^1.0.3",
"@types/png-chunks-encode": "^1.0.2", "@types/png-chunks-encode": "^1.0.2",

View File

@ -13,7 +13,7 @@ import PNGtext from 'png-chunk-text';
* @returns {Buffer} PNG image buffer with metadata * @returns {Buffer} PNG image buffer with metadata
*/ */
export const write = (image, data) => { export const write = (image, data) => {
const chunks = extract(image); const chunks = extract(new Uint8Array(image));
const tEXtChunks = chunks.filter(chunk => chunk.name === 'tEXt'); const tEXtChunks = chunks.filter(chunk => chunk.name === 'tEXt');
// Remove existing tEXt chunks // Remove existing tEXt chunks
@ -52,7 +52,7 @@ export const write = (image, data) => {
* @returns {string} Character data * @returns {string} Character data
*/ */
export const read = (image) => { export const read = (image) => {
const chunks = extract(image); const chunks = extract(new Uint8Array(image));
const textChunks = chunks.filter((chunk) => chunk.name === 'tEXt').map((chunk) => PNGtext.decode(chunk.data)); const textChunks = chunks.filter((chunk) => chunk.name === 'tEXt').map((chunk) => PNGtext.decode(chunk.data));

View File

@ -42,7 +42,6 @@ router.post('/caption-image', jsonParser, async (request, response) => {
'anthropic-version': '2023-06-01', 'anthropic-version': '2023-06-01',
'x-api-key': request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.CLAUDE), 'x-api-key': request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.CLAUDE),
}, },
timeout: 0,
}); });
if (!result.ok) { if (!result.ok) {
@ -51,6 +50,7 @@ router.post('/caption-image', jsonParser, async (request, response) => {
return response.status(result.status).send({ error: true }); return response.status(result.status).send({ error: true });
} }
/** @type {any} */
const generateResponseJson = await result.json(); const generateResponseJson = await result.json();
const caption = generateResponseJson.content[0].text; const caption = generateResponseJson.content[0].text;
console.log('Claude response:', generateResponseJson); console.log('Claude response:', generateResponseJson);

View File

@ -152,7 +152,6 @@ async function sendClaudeRequest(request, response) {
'x-api-key': apiKey, 'x-api-key': apiKey,
...additionalHeaders, ...additionalHeaders,
}, },
timeout: 0,
}); });
if (request.body.stream) { if (request.body.stream) {
@ -165,6 +164,7 @@ async function sendClaudeRequest(request, response) {
return response.status(generateResponse.status).send({ error: true }); return response.status(generateResponse.status).send({ error: true });
} }
/** @type {any} */
const generateResponseJson = await generateResponse.json(); const generateResponseJson = await generateResponse.json();
const responseText = generateResponseJson?.content?.[0]?.text || ''; const responseText = generateResponseJson?.content?.[0]?.text || '';
console.log('Claude response:', generateResponseJson); console.log('Claude response:', generateResponseJson);
@ -212,7 +212,6 @@ async function sendScaleRequest(request, response) {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'Authorization': `Basic ${apiKey}`, 'Authorization': `Basic ${apiKey}`,
}, },
timeout: 0,
}); });
if (!generateResponse.ok) { if (!generateResponse.ok) {
@ -220,6 +219,7 @@ async function sendScaleRequest(request, response) {
return response.status(500).send({ error: true }); return response.status(500).send({ error: true });
} }
/** @type {any} */
const generateResponseJson = await generateResponse.json(); const generateResponseJson = await generateResponse.json();
console.log('Scale response:', generateResponseJson); console.log('Scale response:', generateResponseJson);
@ -335,7 +335,6 @@ async function sendMakerSuiteRequest(request, response) {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
signal: controller.signal, signal: controller.signal,
timeout: 0,
}); });
// have to do this because of their busted ass streaming endpoint // have to do this because of their busted ass streaming endpoint
if (stream) { if (stream) {
@ -354,6 +353,7 @@ async function sendMakerSuiteRequest(request, response) {
return response.status(generateResponse.status).send({ error: true }); return response.status(generateResponse.status).send({ error: true });
} }
/** @type {any} */
const generateResponseJson = await generateResponse.json(); const generateResponseJson = await generateResponse.json();
const candidates = generateResponseJson?.candidates; const candidates = generateResponseJson?.candidates;
@ -676,6 +676,7 @@ router.post('/status', jsonParser, async function (request, response_getstatus_o
}); });
if (response.ok) { if (response.ok) {
/** @type {any} */
const data = await response.json(); const data = await response.json();
response_getstatus_openai.send(data); response_getstatus_openai.send(data);
@ -979,7 +980,6 @@ router.post('/generate', jsonParser, function (request, response) {
}, },
body: JSON.stringify(requestBody), body: JSON.stringify(requestBody),
signal: controller.signal, signal: controller.signal,
timeout: 0,
}; };
console.log(requestBody); console.log(requestBody);
@ -1005,6 +1005,7 @@ router.post('/generate', jsonParser, function (request, response) {
} }
if (fetchResponse.ok) { if (fetchResponse.ok) {
/** @type {any} */
let json = await fetchResponse.json(); let json = await fetchResponse.json();
response.send(json); response.send(json);
console.log(json); console.log(json);

View File

@ -96,7 +96,7 @@ router.post('/generate', jsonParser, async function (request, response_generate)
for (let i = 0; i < MAX_RETRIES; i++) { for (let i = 0; i < MAX_RETRIES; i++) {
try { try {
const url = request.body.streaming ? `${request.body.api_server}/extra/generate/stream` : `${request.body.api_server}/v1/generate`; const url = request.body.streaming ? `${request.body.api_server}/extra/generate/stream` : `${request.body.api_server}/v1/generate`;
const response = await fetch(url, { method: 'POST', timeout: 0, ...args }); const response = await fetch(url, { method: 'POST', ...args });
if (request.body.streaming) { if (request.body.streaming) {
// Pipe remote SSE stream to Express response // Pipe remote SSE stream to Express response
@ -156,6 +156,7 @@ router.post('/status', jsonParser, async function (request, response) {
const result = {}; const result = {};
/** @type {any} */
const [koboldUnitedResponse, koboldExtraResponse, koboldModelResponse] = await Promise.all([ const [koboldUnitedResponse, koboldExtraResponse, koboldModelResponse] = await Promise.all([
// We catch errors both from the response not having a successful HTTP status and from JSON parsing failing // We catch errors both from the response not having a successful HTTP status and from JSON parsing failing

View File

@ -70,7 +70,6 @@ router.post('/generate', jsonParser, async function (request, response) {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'cookie': `_jwt=${cookie}`, 'cookie': `_jwt=${cookie}`,
}, },
timeout: 0,
body: JSON.stringify(body), body: JSON.stringify(body),
}); });
@ -80,6 +79,7 @@ router.post('/generate', jsonParser, async function (request, response) {
return response.status(500).send({ error: { message: result.statusText } }); return response.status(500).send({ error: { message: result.statusText } });
} }
/** @type {any} */
const data = await result.json(); const data = await result.json();
const output = data?.result?.data?.json?.outputs?.[0] || ''; const output = data?.result?.data?.json?.outputs?.[0] || '';

View File

@ -28,6 +28,10 @@ export const router = express.Router();
*/ */
async function parseOllamaStream(jsonStream, request, response) { async function parseOllamaStream(jsonStream, request, response) {
try { try {
if (!jsonStream.body) {
throw new Error('No body in the response');
}
let partialData = ''; let partialData = '';
jsonStream.body.on('data', (data) => { jsonStream.body.on('data', (data) => {
const chunk = data.toString(); const chunk = data.toString();
@ -153,6 +157,7 @@ router.post('/status', jsonParser, async function (request, response) {
return response.status(400); return response.status(400);
} }
/** @type {any} */
let data = await modelsReply.json(); let data = await modelsReply.json();
if (request.body.legacy_api) { if (request.body.legacy_api) {
@ -190,6 +195,7 @@ router.post('/status', jsonParser, async function (request, response) {
const modelInfoReply = await fetch(modelInfoUrl, args); const modelInfoReply = await fetch(modelInfoUrl, args);
if (modelInfoReply.ok) { if (modelInfoReply.ok) {
/** @type {any} */
const modelInfo = await modelInfoReply.json(); const modelInfo = await modelInfoReply.json();
console.log('Ooba model info:', modelInfo); console.log('Ooba model info:', modelInfo);
@ -206,6 +212,7 @@ router.post('/status', jsonParser, async function (request, response) {
const modelInfoReply = await fetch(modelInfoUrl, args); const modelInfoReply = await fetch(modelInfoUrl, args);
if (modelInfoReply.ok) { if (modelInfoReply.ok) {
/** @type {any} */
const modelInfo = await modelInfoReply.json(); const modelInfo = await modelInfoReply.json();
console.log('Tabby model info:', modelInfo); console.log('Tabby model info:', modelInfo);
@ -359,6 +366,7 @@ router.post('/generate', jsonParser, async function (request, response) {
const completionsReply = await fetch(url, args); const completionsReply = await fetch(url, args);
if (completionsReply.ok) { if (completionsReply.ok) {
/** @type {any} */
const data = await completionsReply.json(); const data = await completionsReply.json();
console.log('Endpoint response:', data); console.log('Endpoint response:', data);
@ -415,7 +423,6 @@ ollama.post('/download', jsonParser, async function (request, response) {
name: name, name: name,
stream: false, stream: false,
}), }),
timeout: 0,
}); });
if (!fetchResponse.ok) { if (!fetchResponse.ok) {
@ -448,7 +455,6 @@ ollama.post('/caption-image', jsonParser, async function (request, response) {
images: [request.body.image], images: [request.body.image],
stream: false, stream: false,
}), }),
timeout: 0,
}); });
if (!fetchResponse.ok) { if (!fetchResponse.ok) {
@ -456,6 +462,7 @@ ollama.post('/caption-image', jsonParser, async function (request, response) {
return response.status(500).send({ error: true }); return response.status(500).send({ error: true });
} }
/** @type {any} */
const data = await fetchResponse.json(); const data = await fetchResponse.json();
console.log('Ollama caption response:', data); console.log('Ollama caption response:', data);
@ -487,7 +494,6 @@ llamacpp.post('/caption-image', jsonParser, async function (request, response) {
const fetchResponse = await fetch(`${baseUrl}/completion`, { const fetchResponse = await fetch(`${baseUrl}/completion`, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
timeout: 0,
body: JSON.stringify({ body: JSON.stringify({
prompt: `USER:[img-1]${String(request.body.prompt).trim()}\nASSISTANT:`, prompt: `USER:[img-1]${String(request.body.prompt).trim()}\nASSISTANT:`,
image_data: [{ data: request.body.image, id: 1 }], image_data: [{ data: request.body.image, id: 1 }],
@ -502,6 +508,7 @@ llamacpp.post('/caption-image', jsonParser, async function (request, response) {
return response.status(500).send({ error: true }); return response.status(500).send({ error: true });
} }
/** @type {any} */
const data = await fetchResponse.json(); const data = await fetchResponse.json();
console.log('LlamaCpp caption response:', data); console.log('LlamaCpp caption response:', data);
@ -531,7 +538,6 @@ llamacpp.post('/props', jsonParser, async function (request, response) {
const fetchResponse = await fetch(`${baseUrl}/props`, { const fetchResponse = await fetch(`${baseUrl}/props`, {
method: 'GET', method: 'GET',
timeout: 0,
}); });
if (!fetchResponse.ok) { if (!fetchResponse.ok) {
@ -566,7 +572,6 @@ llamacpp.post('/slots', jsonParser, async function (request, response) {
if (request.body.action === 'info') { if (request.body.action === 'info') {
fetchResponse = await fetch(`${baseUrl}/slots`, { fetchResponse = await fetch(`${baseUrl}/slots`, {
method: 'GET', method: 'GET',
timeout: 0,
}); });
} else { } else {
if (!/^\d+$/.test(request.body.id_slot)) { if (!/^\d+$/.test(request.body.id_slot)) {
@ -579,7 +584,6 @@ llamacpp.post('/slots', jsonParser, async function (request, response) {
fetchResponse = await fetch(`${baseUrl}/slots/${request.body.id_slot}?action=${request.body.action}`, { fetchResponse = await fetch(`${baseUrl}/slots/${request.body.id_slot}?action=${request.body.action}`, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
timeout: 0,
body: JSON.stringify({ body: JSON.stringify({
filename: request.body.action !== 'erase' ? `${request.body.filename}` : undefined, filename: request.body.action !== 'erase' ? `${request.body.filename}` : undefined,
}), }),
@ -623,6 +627,7 @@ tabby.post('/download', jsonParser, async function (request, response) {
}); });
if (permissionResponse.ok) { if (permissionResponse.ok) {
/** @type {any} */
const permissionJson = await permissionResponse.json(); const permissionJson = await permissionResponse.json();
if (permissionJson['permission'] !== 'admin') { if (permissionJson['permission'] !== 'admin') {

View File

@ -380,6 +380,7 @@ async function downloadPygmalionCharacter(id) {
throw new Error('Failed to download character'); throw new Error('Failed to download character');
} }
/** @type {any} */
const jsonData = await result.json(); const jsonData = await result.json();
const characterData = jsonData?.character; const characterData = jsonData?.character;
@ -472,6 +473,7 @@ async function downloadJannyCharacter(uuid) {
}); });
if (result.ok) { if (result.ok) {
/** @type {any} */
const downloadResult = await result.json(); const downloadResult = await result.json();
if (downloadResult.status === 'ok') { if (downloadResult.status === 'ok') {
const imageResult = await fetch(downloadResult.downloadUrl); const imageResult = await fetch(downloadResult.downloadUrl);

View File

@ -40,7 +40,6 @@ router.post('/caption-image', jsonParser, async (request, response) => {
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
timeout: 0,
}); });
if (!result.ok) { if (!result.ok) {
@ -49,6 +48,7 @@ router.post('/caption-image', jsonParser, async (request, response) => {
return response.status(result.status).send({ error: true }); return response.status(result.status).send({ error: true });
} }
/** @type {any} */
const data = await result.json(); const data = await result.json();
console.log('Multimodal captioning response', data); console.log('Multimodal captioning response', data);

View File

@ -68,7 +68,7 @@ router.post('/upload', jsonParser, async (request, response) => {
ensureDirectoryExistence(pathToNewFile); ensureDirectoryExistence(pathToNewFile);
const imageBuffer = Buffer.from(base64Data, 'base64'); const imageBuffer = Buffer.from(base64Data, 'base64');
await fs.promises.writeFile(pathToNewFile, imageBuffer); await fs.promises.writeFile(pathToNewFile, new Uint8Array(imageBuffer));
response.send({ path: clientRelativePath(request.user.directories.root, pathToNewFile) }); response.send({ path: clientRelativePath(request.user.directories.root, pathToNewFile) });
} catch (error) { } catch (error) {
console.log(error); console.log(error);

View File

@ -252,7 +252,7 @@ router.post('/generate', jsonParser, async function (req, res) {
try { try {
const baseURL = (req.body.model.includes('kayra') || req.body.model.includes('erato')) ? TEXT_NOVELAI : API_NOVELAI; const baseURL = (req.body.model.includes('kayra') || req.body.model.includes('erato')) ? TEXT_NOVELAI : API_NOVELAI;
const url = req.body.streaming ? `${baseURL}/ai/generate-stream` : `${baseURL}/ai/generate`; const url = req.body.streaming ? `${baseURL}/ai/generate-stream` : `${baseURL}/ai/generate`;
const response = await fetch(url, { method: 'POST', timeout: 0, ...args }); const response = await fetch(url, { method: 'POST', ...args });
if (req.body.streaming) { if (req.body.streaming) {
// Pipe remote SSE stream to Express response // Pipe remote SSE stream to Express response
@ -274,6 +274,7 @@ router.post('/generate', jsonParser, async function (req, res) {
return res.status(response.status).send({ error: { message } }); return res.status(response.status).send({ error: { message } });
} }
/** @type {any} */
const data = await response.json(); const data = await response.json();
console.log('NovelAI Output', data?.output); console.log('NovelAI Output', data?.output);
return res.send(data); return res.send(data);
@ -416,7 +417,6 @@ router.post('/generate-voice', jsonParser, async (request, response) => {
'Authorization': `Bearer ${token}`, 'Authorization': `Bearer ${token}`,
'Accept': 'audio/mpeg', 'Accept': 'audio/mpeg',
}, },
timeout: 0,
}); });
if (!result.ok) { if (!result.ok) {
@ -426,7 +426,7 @@ router.post('/generate-voice', jsonParser, async (request, response) => {
} }
const chunks = await readAllChunks(result.body); const chunks = await readAllChunks(result.body);
const buffer = Buffer.concat(chunks); const buffer = Buffer.concat(chunks.map(chunk => new Uint8Array(chunk)));
response.setHeader('Content-Type', 'audio/mpeg'); response.setHeader('Content-Type', 'audio/mpeg');
return response.send(buffer); return response.send(buffer);
} }

View File

@ -154,7 +154,6 @@ router.post('/caption-image', jsonParser, async (request, response) => {
...headers, ...headers,
}, },
body: JSON.stringify(body), body: JSON.stringify(body),
timeout: 0,
}); });
if (!result.ok) { if (!result.ok) {
@ -163,6 +162,7 @@ router.post('/caption-image', jsonParser, async (request, response) => {
return response.status(500).send(text); return response.status(500).send(text);
} }
/** @type {any} */
const data = await result.json(); const data = await result.json();
console.log('Multimodal captioning response', data); console.log('Multimodal captioning response', data);
const caption = data?.choices[0]?.message?.content; const caption = data?.choices[0]?.message?.content;
@ -284,7 +284,6 @@ router.post('/generate-image', jsonParser, async (request, response) => {
Authorization: `Bearer ${key}`, Authorization: `Bearer ${key}`,
}, },
body: JSON.stringify(request.body), body: JSON.stringify(request.body),
timeout: 0,
}); });
if (!result.ok) { if (!result.ok) {

View File

@ -65,6 +65,7 @@ router.post('/upscalers', jsonParser, async (request, response) => {
throw new Error('SD WebUI returned an error.'); throw new Error('SD WebUI returned an error.');
} }
/** @type {any} */
const data = await result.json(); const data = await result.json();
const names = data.map(x => x.name); const names = data.map(x => x.name);
return names; return names;
@ -85,6 +86,7 @@ router.post('/upscalers', jsonParser, async (request, response) => {
throw new Error('SD WebUI returned an error.'); throw new Error('SD WebUI returned an error.');
} }
/** @type {any} */
const data = await result.json(); const data = await result.json();
const names = data.map(x => x.name); const names = data.map(x => x.name);
return names; return names;
@ -118,6 +120,7 @@ router.post('/vaes', jsonParser, async (request, response) => {
throw new Error('SD WebUI returned an error.'); throw new Error('SD WebUI returned an error.');
} }
/** @type {any} */
const data = await result.json(); const data = await result.json();
const names = data.map(x => x.model_name); const names = data.map(x => x.model_name);
return response.send(names); return response.send(names);
@ -143,6 +146,7 @@ router.post('/samplers', jsonParser, async (request, response) => {
throw new Error('SD WebUI returned an error.'); throw new Error('SD WebUI returned an error.');
} }
/** @type {any} */
const data = await result.json(); const data = await result.json();
const names = data.map(x => x.name); const names = data.map(x => x.name);
return response.send(names); return response.send(names);
@ -169,6 +173,7 @@ router.post('/schedulers', jsonParser, async (request, response) => {
throw new Error('SD WebUI returned an error.'); throw new Error('SD WebUI returned an error.');
} }
/** @type {any} */
const data = await result.json(); const data = await result.json();
const names = data.map(x => x.name); const names = data.map(x => x.name);
return response.send(names); return response.send(names);
@ -194,6 +199,7 @@ router.post('/models', jsonParser, async (request, response) => {
throw new Error('SD WebUI returned an error.'); throw new Error('SD WebUI returned an error.');
} }
/** @type {any} */
const data = await result.json(); const data = await result.json();
const models = data.map(x => ({ value: x.title, text: x.title })); const models = data.map(x => ({ value: x.title, text: x.title }));
return response.send(models); return response.send(models);
@ -214,6 +220,7 @@ router.post('/get-model', jsonParser, async (request, response) => {
'Authorization': getBasicAuthHeader(request.body.auth), 'Authorization': getBasicAuthHeader(request.body.auth),
}, },
}); });
/** @type {any} */
const data = await result.json(); const data = await result.json();
return response.send(data['sd_model_checkpoint']); return response.send(data['sd_model_checkpoint']);
} catch (error) { } catch (error) {
@ -233,7 +240,6 @@ router.post('/set-model', jsonParser, async (request, response) => {
headers: { headers: {
'Authorization': getBasicAuthHeader(request.body.auth), 'Authorization': getBasicAuthHeader(request.body.auth),
}, },
timeout: 0,
}); });
const data = await result.json(); const data = await result.json();
return data; return data;
@ -253,7 +259,6 @@ router.post('/set-model', jsonParser, async (request, response) => {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'Authorization': getBasicAuthHeader(request.body.auth), 'Authorization': getBasicAuthHeader(request.body.auth),
}, },
timeout: 0,
}); });
if (!result.ok) { if (!result.ok) {
@ -264,6 +269,7 @@ router.post('/set-model', jsonParser, async (request, response) => {
const CHECK_INTERVAL = 2000; const CHECK_INTERVAL = 2000;
for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) { for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
/** @type {any} */
const progressState = await getProgress(); const progressState = await getProgress();
const progress = progressState['progress']; const progress = progressState['progress'];
@ -308,8 +314,6 @@ router.post('/generate', jsonParser, async (request, response) => {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'Authorization': getBasicAuthHeader(request.body.auth), 'Authorization': getBasicAuthHeader(request.body.auth),
}, },
timeout: 0,
// @ts-ignore
signal: controller.signal, signal: controller.signal,
}); });
@ -345,6 +349,7 @@ router.post('/sd-next/upscalers', jsonParser, async (request, response) => {
// Vlad doesn't provide Latent Upscalers in the API, so we have to hardcode them here // Vlad doesn't provide Latent Upscalers in the API, so we have to hardcode them here
const latentUpscalers = ['Latent', 'Latent (antialiased)', 'Latent (bicubic)', 'Latent (bicubic antialiased)', 'Latent (nearest)', 'Latent (nearest-exact)']; const latentUpscalers = ['Latent', 'Latent (antialiased)', 'Latent (bicubic)', 'Latent (bicubic antialiased)', 'Latent (nearest)', 'Latent (nearest-exact)'];
/** @type {any} */
const data = await result.json(); const data = await result.json();
const names = data.map(x => x.name); const names = data.map(x => x.name);
@ -387,6 +392,7 @@ comfy.post('/samplers', jsonParser, async (request, response) => {
throw new Error('ComfyUI returned an error.'); throw new Error('ComfyUI returned an error.');
} }
/** @type {any} */
const data = await result.json(); const data = await result.json();
return response.send(data.KSampler.input.required.sampler_name[0]); return response.send(data.KSampler.input.required.sampler_name[0]);
} catch (error) { } catch (error) {
@ -404,6 +410,7 @@ comfy.post('/models', jsonParser, async (request, response) => {
if (!result.ok) { if (!result.ok) {
throw new Error('ComfyUI returned an error.'); throw new Error('ComfyUI returned an error.');
} }
/** @type {any} */
const data = await result.json(); const data = await result.json();
return response.send(data.CheckpointLoaderSimple.input.required.ckpt_name[0].map(it => ({ value: it, text: it }))); return response.send(data.CheckpointLoaderSimple.input.required.ckpt_name[0].map(it => ({ value: it, text: it })));
} catch (error) { } catch (error) {
@ -422,6 +429,7 @@ comfy.post('/schedulers', jsonParser, async (request, response) => {
throw new Error('ComfyUI returned an error.'); throw new Error('ComfyUI returned an error.');
} }
/** @type {any} */
const data = await result.json(); const data = await result.json();
return response.send(data.KSampler.input.required.scheduler[0]); return response.send(data.KSampler.input.required.scheduler[0]);
} catch (error) { } catch (error) {
@ -440,6 +448,7 @@ comfy.post('/vaes', jsonParser, async (request, response) => {
throw new Error('ComfyUI returned an error.'); throw new Error('ComfyUI returned an error.');
} }
/** @type {any} */
const data = await result.json(); const data = await result.json();
return response.send(data.VAELoader.input.required.vae_name[0]); return response.send(data.VAELoader.input.required.vae_name[0]);
} catch (error) { } catch (error) {
@ -521,6 +530,7 @@ comfy.post('/generate', jsonParser, async (request, response) => {
throw new Error('ComfyUI returned an error.'); throw new Error('ComfyUI returned an error.');
} }
/** @type {any} */
const data = await promptResult.json(); const data = await promptResult.json();
const id = data.prompt_id; const id = data.prompt_id;
let item; let item;
@ -531,6 +541,7 @@ comfy.post('/generate', jsonParser, async (request, response) => {
if (!result.ok) { if (!result.ok) {
throw new Error('ComfyUI returned an error.'); throw new Error('ComfyUI returned an error.');
} }
/** @type {any} */
const history = await result.json(); const history = await result.json();
item = history[id]; item = history[id];
if (item) { if (item) {
@ -633,6 +644,7 @@ together.post('/generate', jsonParser, async (request, response) => {
return response.sendStatus(500); return response.sendStatus(500);
} }
/** @type {any} */
const data = await result.json(); const data = await result.json();
console.log('TogetherAI response:', data); console.log('TogetherAI response:', data);
@ -681,6 +693,8 @@ drawthings.post('/get-model', jsonParser, async (request, response) => {
const result = await fetch(url, { const result = await fetch(url, {
method: 'GET', method: 'GET',
}); });
/** @type {any} */
const data = await result.json(); const data = await result.json();
return response.send(data['model']); return response.send(data['model']);
@ -698,6 +712,8 @@ drawthings.post('/get-upscaler', jsonParser, async (request, response) => {
const result = await fetch(url, { const result = await fetch(url, {
method: 'GET', method: 'GET',
}); });
/** @type {any} */
const data = await result.json(); const data = await result.json();
return response.send(data['upscaler']); return response.send(data['upscaler']);
@ -726,7 +742,6 @@ drawthings.post('/generate', jsonParser, async (request, response) => {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'Authorization': auth, 'Authorization': auth,
}, },
timeout: 0,
}); });
if (!result.ok) { if (!result.ok) {
@ -848,7 +863,6 @@ stability.post('/generate', jsonParser, async (request, response) => {
'Accept': 'image/*', 'Accept': 'image/*',
}, },
body: formData, body: formData,
timeout: 0,
}); });
if (!result.ok) { if (!result.ok) {

View File

@ -78,6 +78,7 @@ router.post('/libre', jsonParser, async (request, response) => {
return response.sendStatus(result.status); return response.sendStatus(result.status);
} }
/** @type {any} */
const json = await result.json(); const json = await result.json();
console.log('Translated text: ' + json.translatedText); console.log('Translated text: ' + json.translatedText);
@ -158,7 +159,6 @@ router.post('/yandex', jsonParser, async (request, response) => {
headers: { headers: {
'Content-Type': 'application/x-www-form-urlencoded', 'Content-Type': 'application/x-www-form-urlencoded',
}, },
timeout: 0,
}); });
if (!result.ok) { if (!result.ok) {
@ -167,6 +167,7 @@ router.post('/yandex', jsonParser, async (request, response) => {
return response.sendStatus(500); return response.sendStatus(500);
} }
/** @type {any} */
const json = await result.json(); const json = await result.json();
const translated = json.text.join(); const translated = json.text.join();
console.log('Translated text: ' + translated); console.log('Translated text: ' + translated);
@ -264,7 +265,6 @@ router.post('/deepl', jsonParser, async (request, response) => {
'Authorization': `DeepL-Auth-Key ${key}`, 'Authorization': `DeepL-Auth-Key ${key}`,
'Content-Type': 'application/x-www-form-urlencoded', 'Content-Type': 'application/x-www-form-urlencoded',
}, },
timeout: 0,
}); });
if (!result.ok) { if (!result.ok) {
@ -273,6 +273,7 @@ router.post('/deepl', jsonParser, async (request, response) => {
return response.sendStatus(result.status); return response.sendStatus(result.status);
} }
/** @type {any} */
const json = await result.json(); const json = await result.json();
console.log('Translated text: ' + json.translations[0].text); console.log('Translated text: ' + json.translations[0].text);
@ -317,7 +318,6 @@ router.post('/onering', jsonParser, async (request, response) => {
const result = await fetch(fetchUrl, { const result = await fetch(fetchUrl, {
method: 'GET', method: 'GET',
timeout: 0,
}); });
if (!result.ok) { if (!result.ok) {
@ -326,6 +326,7 @@ router.post('/onering', jsonParser, async (request, response) => {
return response.sendStatus(result.status); return response.sendStatus(result.status);
} }
/** @type {any} */
const data = await result.json(); const data = await result.json();
console.log('Translated text: ' + data.result); console.log('Translated text: ' + data.result);
@ -373,7 +374,6 @@ router.post('/deeplx', jsonParser, async (request, response) => {
'Accept': 'application/json', 'Accept': 'application/json',
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
timeout: 0,
}); });
if (!result.ok) { if (!result.ok) {
@ -382,6 +382,7 @@ router.post('/deeplx', jsonParser, async (request, response) => {
return response.sendStatus(result.status); return response.sendStatus(result.status);
} }
/** @type {any} */
const json = await result.json(); const json = await result.json();
console.log('Translated text: ' + json.data); console.log('Translated text: ' + json.data);

View File

@ -3,7 +3,7 @@ import fs from 'node:fs';
import process from 'node:process'; import process from 'node:process';
import { Buffer } from 'node:buffer'; import { Buffer } from 'node:buffer';
import { pipeline, env, RawImage, Pipeline } from 'sillytavern-transformers'; import { pipeline, env, RawImage } from 'sillytavern-transformers';
import { getConfigValue } from './util.js'; import { getConfigValue } from './util.js';
configureTransformers(); configureTransformers();
@ -117,7 +117,7 @@ async function migrateCacheToDataDir() {
* Gets the transformers.js pipeline for a given task. * Gets the transformers.js pipeline for a given task.
* @param {import('sillytavern-transformers').PipelineType} task The task to get the pipeline for * @param {import('sillytavern-transformers').PipelineType} task The task to get the pipeline for
* @param {string} forceModel The model to use for the pipeline, if any * @param {string} forceModel The model to use for the pipeline, if any
* @returns {Promise<Pipeline>} Pipeline for the task * @returns {Promise<import('sillytavern-transformers').Pipeline>} The transformers.js pipeline
*/ */
export async function getPipeline(task, forceModel = '') { export async function getPipeline(task, forceModel = '') {
await migrateCacheToDataDir(); await migrateCacheToDataDir();
@ -137,6 +137,7 @@ export async function getPipeline(task, forceModel = '') {
const instance = await pipeline(task, model, { cache_dir: cacheDir, quantized: tasks[task].quantized ?? true, local_files_only: localOnly }); const instance = await pipeline(task, model, { cache_dir: cacheDir, quantized: tasks[task].quantized ?? true, local_files_only: localOnly });
tasks[task].pipeline = instance; tasks[task].pipeline = instance;
tasks[task].currentModel = model; tasks[task].currentModel = model;
// @ts-ignore
return instance; return instance;
} }

View File

@ -441,6 +441,7 @@ export function forwardFetchResponse(from, to) {
to.statusCode = statusCode; to.statusCode = statusCode;
to.statusMessage = statusText; to.statusMessage = statusText;
if (from.body && to.socket) {
from.body.pipe(to); from.body.pipe(to);
to.socket.on('close', function () { to.socket.on('close', function () {
@ -452,6 +453,9 @@ export function forwardFetchResponse(from, to) {
console.log('Streaming request finished'); console.log('Streaming request finished');
to.end(); to.end();
}); });
} else {
to.end();
}
} }
/** /**

View File

@ -38,6 +38,7 @@ export async function getCohereBatchVector(texts, isQuery, directories, model) {
throw new Error('API request failed'); throw new Error('API request failed');
} }
/** @type {any} */
const data = await response.json(); const data = await response.json();
if (!Array.isArray(data?.embeddings?.float)) { if (!Array.isArray(data?.embeddings?.float)) {
console.log('API response was not an array'); console.log('API response was not an array');

View File

@ -66,6 +66,7 @@ async function getExtrasVectorImpl(text, apiUrl, apiKey) {
throw new Error('Extras request failed'); throw new Error('Extras request failed');
} }
/** @type {any} */
const data = await response.json(); const data = await response.json();
const vector = data.embedding; // `embedding`: number[] (one text item), or number[][] (multiple text items). const vector = data.embedding; // `embedding`: number[] (one text item), or number[][] (multiple text items).

View File

@ -30,6 +30,7 @@ export async function getLlamaCppBatchVector(texts, apiUrl, directories) {
throw new Error(`LlamaCpp: Failed to get vector for text: ${response.statusText} ${responseText}`); throw new Error(`LlamaCpp: Failed to get vector for text: ${response.statusText} ${responseText}`);
} }
/** @type {any} */
const data = await response.json(); const data = await response.json();
if (!Array.isArray(data?.data)) { if (!Array.isArray(data?.data)) {

View File

@ -52,6 +52,7 @@ export async function getMakerSuiteVector(text, directories) {
throw new Error('Google AI Studio request failed'); throw new Error('Google AI Studio request failed');
} }
/** @type {any} */
const data = await response.json(); const data = await response.json();
// noinspection JSValidateTypes // noinspection JSValidateTypes
return data['embedding']['values']; return data['embedding']['values'];

View File

@ -51,6 +51,7 @@ export async function getNomicAIBatchVector(texts, source, directories) {
throw new Error('API request failed'); throw new Error('API request failed');
} }
/** @type {any} */
const data = await response.json(); const data = await response.json();
if (!Array.isArray(data?.embeddings)) { if (!Array.isArray(data?.embeddings)) {
console.log('API response was not an array'); console.log('API response was not an array');

View File

@ -54,6 +54,7 @@ export async function getOllamaVector(text, apiUrl, model, keep, directories) {
throw new Error(`Ollama: Failed to get vector for text: ${response.statusText} ${responseText}`); throw new Error(`Ollama: Failed to get vector for text: ${response.statusText} ${responseText}`);
} }
/** @type {any} */
const data = await response.json(); const data = await response.json();
if (!Array.isArray(data?.embedding)) { if (!Array.isArray(data?.embedding)) {

View File

@ -61,6 +61,7 @@ export async function getOpenAIBatchVector(texts, source, directories, model = '
throw new Error('API request failed'); throw new Error('API request failed');
} }
/** @type {any} */
const data = await response.json(); const data = await response.json();
if (!Array.isArray(data?.data)) { if (!Array.isArray(data?.data)) {

View File

@ -31,6 +31,7 @@ export async function getVllmBatchVector(texts, apiUrl, model, directories) {
throw new Error(`VLLM: Failed to get vector for text: ${response.statusText} ${responseText}`); throw new Error(`VLLM: Failed to get vector for text: ${response.statusText} ${responseText}`);
} }
/** @type {any} */
const data = await response.json(); const data = await response.json();
if (!Array.isArray(data?.data)) { if (!Array.isArray(data?.data)) {