Add retry logic to OpenAI request handling

This commit is contained in:
Cohee
2023-07-05 21:43:33 +03:00
parent 59f857262b
commit 4e8a2b8386

108
server.js
View File

@@ -1790,9 +1790,9 @@ app.post("/importcharacter", urlencodedParser, async function (request, response
} else if (jsonData.name !== undefined) { } else if (jsonData.name !== undefined) {
console.log('importing from v1 json'); console.log('importing from v1 json');
jsonData.name = sanitize(jsonData.name); jsonData.name = sanitize(jsonData.name);
if (jsonData.creator_notes) { if (jsonData.creator_notes) {
jsonData.creator_notes = jsonData.creator_notes.replace("Creator's notes go here.", ""); jsonData.creator_notes = jsonData.creator_notes.replace("Creator's notes go here.", "");
} }
png_name = getPngName(jsonData.name); png_name = getPngName(jsonData.name);
let char = { let char = {
"name": jsonData.name, "name": jsonData.name,
@@ -1815,9 +1815,9 @@ app.post("/importcharacter", urlencodedParser, async function (request, response
} else if (jsonData.char_name !== undefined) {//json Pygmalion notepad } else if (jsonData.char_name !== undefined) {//json Pygmalion notepad
console.log('importing from gradio json'); console.log('importing from gradio json');
jsonData.char_name = sanitize(jsonData.char_name); jsonData.char_name = sanitize(jsonData.char_name);
if (jsonData.creator_notes) { if (jsonData.creator_notes) {
jsonData.creator_notes = jsonData.creator_notes.replace("Creator's notes go here.", ""); jsonData.creator_notes = jsonData.creator_notes.replace("Creator's notes go here.", "");
} }
png_name = getPngName(jsonData.char_name); png_name = getPngName(jsonData.char_name);
let char = { let char = {
"name": jsonData.char_name, "name": jsonData.char_name,
@@ -1872,9 +1872,9 @@ app.post("/importcharacter", urlencodedParser, async function (request, response
} else if (jsonData.name !== undefined) { } else if (jsonData.name !== undefined) {
console.log('Found a v1 character file.'); console.log('Found a v1 character file.');
if (jsonData.creator_notes) { if (jsonData.creator_notes) {
jsonData.creator_notes = jsonData.creator_notes.replace("Creator's notes go here.", ""); jsonData.creator_notes = jsonData.creator_notes.replace("Creator's notes go here.", "");
} }
let char = { let char = {
"name": jsonData.name, "name": jsonData.name,
@@ -3198,17 +3198,20 @@ app.post("/generate_openai", jsonParser, function (request, response_generate_op
signal: controller.signal, signal: controller.signal,
}; };
if (request.body.stream) if (request.body.stream) {
config.responseType = 'stream'; config.responseType = 'stream';
}
async function makeRequest(config, response_generate_openai, request, retries = 5, timeout = 1000) {
try {
const response = await axios(config);
axios(config)
.then(function (response) {
if (response.status <= 299) { if (response.status <= 299) {
if (request.body.stream) { if (request.body.stream) {
console.log("Streaming request in progress") console.log('Streaming request in progress');
response.data.pipe(response_generate_openai); response.data.pipe(response_generate_openai);
response.data.on('end', function () { response.data.on('end', () => {
console.log("Streaming request finished"); console.log('Streaming request finished');
response_generate_openai.end(); response_generate_openai.end();
}); });
} else { } else {
@@ -3216,54 +3219,37 @@ app.post("/generate_openai", jsonParser, function (request, response_generate_op
console.log(response.data); console.log(response.data);
console.log(response.data?.choices[0]?.message); console.log(response.data?.choices[0]?.message);
} }
} else if (response.status == 400) { } else {
console.log('Validation error'); handleErrorResponse(response, response_generate_openai, request);
response_generate_openai.send({ error: true });
} else if (response.status == 401) {
console.log('Access Token is incorrect');
response_generate_openai.send({ error: true });
} else if (response.status == 402) {
console.log('An active subscription is required to access this endpoint');
response_generate_openai.send({ error: true });
} else if (response.status == 429) {
console.log('Out of quota');
const quota_error = response?.data?.type === 'insufficient_quota';
response_generate_openai.send({ error: true, quota_error, });
} else if (response.status == 500 || response.status == 409 || response.status == 504) {
if (request.body.stream) {
response.data.on('data', chunk => {
console.log(chunk.toString());
});
} else {
console.log(response.data);
}
response_generate_openai.send({ error: true });
} }
}) } catch (error) {
.catch(function (error) { if (error.response && error.response.status === 429 && retries > 0) {
if (error.response) { console.log('Out of quota, retrying...');
if (request.body.stream) { setTimeout(() => {
error.response.data.on('data', chunk => { makeRequest(config, response_generate_openai, request, retries - 1);
console.log(chunk.toString()); }, timeout);
}); } else {
} else { handleError(error, response_generate_openai, request);
console.log(error.response.data);
}
} }
try { }
const quota_error = error?.response?.status === 429 && error?.response?.data?.error?.type === 'insufficient_quota'; }
if (!response_generate_openai.headersSent) {
response_generate_openai.send({ error: true, quota_error }); function handleErrorResponse(response, response_generate_openai, request) {
} if (response.status >= 400 && response.status <= 504) {
} catch (error) { console.log('Error occurred:', response.status, response.data);
console.error(error); response_generate_openai.send({ error: true });
if (!response_generate_openai.headersSent) { }
return response_generate_openai.send({ error: true }); }
}
} finally { function handleError(error, response_generate_openai, request) {
response_generate_openai.end(); console.error('Error:', error.message);
} const quota_error = error?.response?.status === 429 && error?.response?.data?.error?.type === 'insufficient_quota';
}); if (!response_generate_openai.headersSent) {
response_generate_openai.send({ error: true, quota_error: quota_error });
}
}
makeRequest(config, response_generate_openai, request);
}); });
app.post("/tokenize_openai", jsonParser, function (request, response_tokenize_openai = response) { app.post("/tokenize_openai", jsonParser, function (request, response_tokenize_openai = response) {