Stop any request. Part 2 (still WIP)

This commit is contained in:
SillyLossy
2023-05-24 16:46:05 +03:00
parent 5cb5ea1c2d
commit a0ef9fce83
3 changed files with 68 additions and 56 deletions

View File

@ -1726,6 +1726,7 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject,
setGenerationProgress(0);
tokens_already_generated = 0;
generation_started = new Date();
abortController = new AbortController();
const isImpersonate = type == "impersonate";
const isInstruct = power_user.instruct.enabled;
@ -2226,7 +2227,6 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject,
let generate_url = getGenerateUrl();
console.log('rungenerate calling API');
abortController = new AbortController();
showStopButton();
if (main_api == 'openai') {
@ -2238,7 +2238,7 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject,
}
}
else if (main_api == 'koboldhorde') {
generateHorde(finalPromt, generate_data).then(onSuccess).catch(onError);
generateHorde(finalPromt, generate_data, abortController.signal).then(onSuccess).catch(onError);
}
else if (main_api == 'poe') {
if (isStreamingEnabled() && type !== 'quiet') {
@ -2421,12 +2421,13 @@ async function Generate(type, { automatic_trigger, force_name2, resolve, reject,
};
function onError(exception) {
hideStopButton();
reject(exception);
$("#send_textarea").removeAttr('disabled');
is_send_press = false;
activateSendButtons();
showSwipeButtons();
setGenerationProgress(0);
$('.mes_buttons:last').show();
console.log(exception);
};
@ -6519,9 +6520,9 @@ $(document).ready(function () {
streamingProcessor.onStopStreaming();
streamingProcessor = null;
}
if (!isStreamingEnabled() && abortController) {
if (abortController) {
abortController.abort();
abortController = null;
hideStopButton();
}
});

View File

@ -79,7 +79,7 @@ async function adjustHordeGenerationParams(max_context_length, max_length) {
return { maxContextLength, maxLength };
}
async function generateHorde(prompt, params) {
async function generateHorde(prompt, params, signal) {
validateHordeModel();
delete params.prompt;
@ -119,6 +119,16 @@ async function generateHorde(prompt, params) {
console.log(`Horde task id = ${task_id}`);
for (let retryNumber = 0; retryNumber < MAX_RETRIES; retryNumber++) {
if (signal.aborted) {
await fetch(`https://horde.koboldai.net/api/v2/generate/text/status/${task_id}`, {
method: 'DELETE',
headers: {
"Client-Agent": CLIENT_VERSION,
}
});
throw new Error('Request aborted');
}
const statusCheckResponse = await fetch(`https://horde.koboldai.net/api/v2/generate/text/status/${task_id}`, getRequestArgs());
const statusCheckJson = await statusCheckResponse.json();

101
server.js
View File

@ -332,7 +332,6 @@ app.post("/generate", jsonParser, async function (request, response_generate = r
const controller = new AbortController();
request.socket.removeAllListeners('close');
request.socket.on('close', function () {
console.log('Kobold aborted');
controller.abort();
});
@ -390,19 +389,17 @@ app.post("/generate", jsonParser, async function (request, response_generate = r
}
catch (error) {
// data
console.log(error[0]);
if (typeof error['text'] === 'function') {
console.log(await error.text());
}
// response
if (error[1]) {
switch (error[1].statusCode) {
case 503:
await delay(delayAmount);
break;
default:
return response_generate.send({ error: true });
}
} else {
return response_generate.send({ error: true });
switch (error.statusCode) {
case 503:
await delay(delayAmount);
break;
default:
return response_generate.send({ error: true });
}
}
}
@ -1359,7 +1356,7 @@ app.post("/getstatus_novelai", jsonParser, function (request, response_getstatus
});
});
app.post("/generate_novelai", jsonParser, function (request, response_generate_novel = response) {
app.post("/generate_novelai", jsonParser, async function (request, response_generate_novel = response) {
if (!request.body) return response_generate_novel.sendStatus(400);
const api_key_novel = readSecret(SECRET_KEYS.NOVEL);
@ -1368,8 +1365,14 @@ app.post("/generate_novelai", jsonParser, function (request, response_generate_n
return response_generate_novel.sendStatus(401);
}
const controller = new AbortController();
request.socket.removeAllListeners('close');
request.socket.on('close', function () {
controller.abort();
});
console.log(request.body);
var data = {
const data = {
"input": request.body.input,
"model": request.body.model,
"parameters": {
@ -1382,6 +1385,9 @@ app.post("/generate_novelai", jsonParser, function (request, response_generate_n
"repetition_penalty_range": request.body.repetition_penalty_range,
"repetition_penalty_frequency": request.body.repetition_penalty_frequency,
"repetition_penalty_presence": request.body.repetition_penalty_presence,
"top_a": request.body.top_a,
"top_p": request.body.top_p,
"top_k": request.body.top_k,
//"stop_sequences": {{187}},
//bad_words_ids = {{50256}, {0}, {1}};
//generate_until_sentence = true;
@ -1393,37 +1399,31 @@ app.post("/generate_novelai", jsonParser, function (request, response_generate_n
}
};
var args = {
data: data,
headers: { "Content-Type": "application/json", "Authorization": "Bearer " + api_key_novel }
const args = {
body: JSON.stringify(data),
headers: { "Content-Type": "application/json", "Authorization": "Bearer " + api_key_novel },
signal: controller.signal,
};
client.post(api_novelai + "/ai/generate", args, function (data, response) {
if (response.statusCode == 201) {
console.log(data);
response_generate_novel.send(data);
try {
const response = await postAsync(api_novelai + "/ai/generate", args);
console.log(response);
return response_generate_novel.send(response);
} catch (error) {
switch (error?.statusCode) {
case 400:
console.log('Validation error');
break;
case 401:
console.log('Access Token is incorrect');
break;
case 402:
console.log('An active subscription is required to access this endpoint');
break;
}
if (response.statusCode == 400) {
console.log('Validation error');
response_generate_novel.send({ error: true });
}
if (response.statusCode == 401) {
console.log('Access Token is incorrect');
response_generate_novel.send({ error: true });
}
if (response.statusCode == 402) {
console.log('An active subscription is required to access this endpoint');
response_generate_novel.send({ error: true });
}
if (response.statusCode == 500 || response.statusCode == 409) {
console.log(data);
response_generate_novel.send({ error: true });
}
}).on('error', function () {
//console.log('');
//console.log('something went wrong on the request', err.request.options);
response_getstatus.send({ error: true });
});
return response_generate_novel.send({ error: true });
}
});
app.post("/getallchatsofcharacter", jsonParser, function (request, response) {
@ -2611,14 +2611,14 @@ function putAsync(url, args) {
}
async function postAsync(url, args) {
const response = await fetch(url, { method: 'POST', args });
const response = await fetch(url, { method: 'POST', ...args });
if (response.ok) {
const data = response.json();
const data = await response.json();
return data;
}
throw new Error(response.statusText);
throw new Error(response);
}
function getAsync(url, args) {
@ -2836,19 +2836,20 @@ app.post('/generate_horde', jsonParser, async (request, response) => {
const url = 'https://horde.koboldai.net/api/v2/generate/text/async';
const args = {
body: JSON.stringify(request.body),
headers: {
"body": JSON.stringify(request.body),
"headers": {
"Content-Type": "application/json",
"Client-Agent": request.header('Client-Agent'),
"apikey": api_key_horde,
}
};
console.log(args.data);
console.log(args.body);
try {
const data = await postAsync(url, args);
return response.send(data);
} catch {
} catch (error) {
console.error(error);
return response.sendStatus(500);
}
});