diff --git a/public/script.js b/public/script.js index 2942378dc..df0a2edcc 100644 --- a/public/script.js +++ b/public/script.js @@ -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(); } }); diff --git a/public/scripts/horde.js b/public/scripts/horde.js index 8361033be..a16756e2a 100644 --- a/public/scripts/horde.js +++ b/public/scripts/horde.js @@ -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(); diff --git a/server.js b/server.js index a0df06405..f8f65669f 100644 --- a/server.js +++ b/server.js @@ -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); } });