From 243a4cd1c1c1ee4e6dfa209e982f483fbca47efc Mon Sep 17 00:00:00 2001 From: Kenny White Date: Tue, 13 May 2025 16:23:17 +0200 Subject: [PATCH 1/2] Improved error handling in Invoke-OAIBeta to surface API errors from Invoke-RestMethod. Now reads the HTTP response stream when ErrorDetails is null, enabling display of OpenAI error messages like 'insufficient_quota' for billing. --- PSAI.psd1 | 2 +- Private/Invoke-OAIBeta.ps1 | 53 ++++++++++++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/PSAI.psd1 b/PSAI.psd1 index 87c14b0..b4e0e93 100644 --- a/PSAI.psd1 +++ b/PSAI.psd1 @@ -1,6 +1,6 @@ @{ RootModule = 'PSAI.psm1' - ModuleVersion = '0.4.9' + ModuleVersion = '0.4.10' GUID = '68662d19-a8f1-484f-b1b7-3bf0e8a436df' Author = 'Douglas Finke' CompanyName = 'Doug Finke' diff --git a/Private/Invoke-OAIBeta.ps1 b/Private/Invoke-OAIBeta.ps1 index 00ca02d..4ca2e76 100644 --- a/Private/Invoke-OAIBeta.ps1 +++ b/Private/Invoke-OAIBeta.ps1 @@ -118,22 +118,53 @@ function Invoke-OAIBeta { Invoke-RestMethod @params } catch { + $targetError = $null + $message = $null + if ($Provider -eq 'OpenAI') { - $message = $_.ErrorDetails.Message - if (Test-JsonReplacement $message -ErrorAction SilentlyContinue) { - $targetError = $message | ConvertFrom-Json - $targetError = $targetError.error.message - } + if ($null -ne $_.ErrorDetails) { + $message = $_.ErrorDetails.Message + } + + if ($null -ne $message -and (Test-JsonReplacement $message -ErrorAction SilentlyContinue)) { + try { + $parsed = $message | ConvertFrom-Json + $targetError = $parsed.error.message + } + catch { + $targetError = "Failed to parse OpenAI error JSON: $message" + } + } + elseif ($null -ne $_.Exception.Response) { + try { + $reader = New-Object System.IO.StreamReader($_.Exception.Response.GetResponseStream()) + $responseBody = $reader.ReadToEnd() + + if ($responseBody | Test-JsonReplacement -ErrorAction SilentlyContinue) { + $json = $responseBody | ConvertFrom-Json + $targetError = $json.error.message + } + else { + $targetError = "Raw OpenAI response: $responseBody" + } + } + catch { + $targetError = "Unable to read HTTP error response: $_" + } + } else { - $targetError = "[{0}] - {1}" -f $Uri, $message + $fallbackMessage = if ($null -ne $message) { $message } else { $_.Exception.Message } + $targetError = "[{0}] - {1}" -f $Uri, $fallbackMessage } } - - if ($Provider -eq 'AzureOpenAI') { + elseif ($Provider -eq 'AzureOpenAI') { $targetError = $_.Exception.Message } - - # Write-Error $targetError + else { + $targetError = "Unhandled provider or unknown error: $($_.Exception.Message)" + } + + Write-Error "OpenAI API call failed: $targetError" throw $targetError - } + } } From c9872569b48d384e785441a0bf5dc80c7125f037 Mon Sep 17 00:00:00 2001 From: dfinke Date: Wed, 14 May 2025 12:45:07 -0400 Subject: [PATCH 2/2] Add changelog entry for version 0.4.10 with user message for quota exceeded --- changelog.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/changelog.md b/changelog.md index 0a5ea50..eaea915 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,8 @@ +## v0.4.10 + +- Big thank you to [Kenny White](https://github.com/whiteken) + - Added much needed message info for the user "You exceeded your current quota, please check your plan and billing details" + ## v0.4.9 - Made `Search-YouTube` and `Get-YouTubeTranscript` global functions