diff --git a/public/scripts/openai.js b/public/scripts/openai.js
index 5c9173904..6a4175bd1 100644
--- a/public/scripts/openai.js
+++ b/public/scripts/openai.js
@@ -440,6 +440,40 @@ function getSystemPrompt(nsfw_toggle_prompt, enhance_definitions_prompt, wiBefor
return whole_prompt;
}
+function tryParseStreamingError(str) {
+ try {
+ const data = JSON.parse(str);
+
+ if (!data) {
+ return;
+ }
+
+ checkQuotaError(data);
+
+ if (data.error) {
+ throw new Error(data);
+ }
+ }
+ catch {
+ // No JSON. Do nothing.
+ }
+}
+
+function checkQuotaError(data) {
+ const errorText = `
You have no credits left to use with this API key.
+ Check your billing details on the
+ OpenAI website.
`;
+
+ if (!data) {
+ return;
+ }
+
+ if (data.quota_error) {
+ callPopup(errorText, 'text');
+ throw new Error(data);
+ }
+}
+
async function sendOpenAIRequest(openai_msgs_tosend, signal) {
// Provide default abort signal
if (!signal) {
@@ -491,9 +525,7 @@ async function sendOpenAIRequest(openai_msgs_tosend, signal) {
const { done, value } = await reader.read();
let response = decoder.decode(value);
- if (response == "{\"error\":true}") {
- throw new Error('error during streaming');
- }
+ tryParseStreamingError(response);
let eventList = response.split("\n");
@@ -518,6 +550,8 @@ async function sendOpenAIRequest(openai_msgs_tosend, signal) {
else {
const data = await response.json();
+ checkQuotaError(data);
+
if (data.error) {
throw new Error(data);
}
diff --git a/server.js b/server.js
index e7d339ac4..9b58dfad9 100644
--- a/server.js
+++ b/server.js
@@ -2285,7 +2285,8 @@ app.post("/generate_openai", jsonParser, function (request, response_generate_op
}
}
try {
- response_generate_openai.send({ error: true });
+ const quota_error = error.response.status == 429;
+ response_generate_openai.send({ error: true, quota_error });
} catch (error) {
console.error(error);
}