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); }