diff --git a/lib/deep-research.ts b/lib/deep-research.ts index 43a53f1..455dd97 100644 --- a/lib/deep-research.ts +++ b/lib/deep-research.ts @@ -126,7 +126,7 @@ export function generateSearchQueries({ system: systemPrompt(), prompt, onError({ error }) { - throw error + throwAiError('generateSearchQueries', error) }, }) } @@ -174,7 +174,7 @@ function processSearchResult({ system: systemPrompt(), prompt, onError({ error }) { - throw error + throwAiError('processSearchResult', error) }, }) } @@ -204,7 +204,7 @@ export function writeFinalReport({ system: systemPrompt(), prompt: _prompt, onError({ error }) { - throw error + throwAiError('writeFinalReport', error) }, }) } diff --git a/lib/feedback.ts b/lib/feedback.ts index 29b9261..13f836d 100644 --- a/lib/feedback.ts +++ b/lib/feedback.ts @@ -37,8 +37,7 @@ export function generateFeedback({ system: systemPrompt(), prompt, onError({ error }) { - console.error(`generateFeedback`, error) - throw error + throwAiError('generateFeedback', error) }, }) diff --git a/utils/errors.ts b/utils/errors.ts new file mode 100644 index 0000000..e5b21d7 --- /dev/null +++ b/utils/errors.ts @@ -0,0 +1,27 @@ +import { APICallError } from 'ai' + +/** + * Parse an error thrown by the AI SDK, and re-throw it with a human-readable message + */ +export function throwAiError(operation: string, error: unknown) { + if (APICallError.isInstance(error)) { + let message = error.message + if (error.statusCode) message += ` (${error.statusCode})` + if (error.cause) message += `\nCause: ${error.cause}` + if (error.responseBody) message += `\nResponse: ${error.responseBody}` + if (error.url) message += `\nURL: ${error.url}` + + console.error(`[${operation}]`, error, { + statusCode: error.statusCode, + response: error.responseBody, + cause: error.cause, + stack: error.stack, + isRetryable: error.isRetryable, + url: error.url, + }) + throw new Error(message) + } else { + console.error(`[${operation}]`, error) + } + throw error +}