( errorMessage: string, )
| 769 | * Returns the status code if found, undefined otherwise. |
| 770 | */ |
| 771 | export const extractStatusCodeFromMessage = ( |
| 772 | errorMessage: string, |
| 773 | ): number | undefined => { |
| 774 | const lowerMessage = errorMessage.toLowerCase() |
| 775 | |
| 776 | // AI SDK's built-in retry error (e.g., "Failed after 4 attempts. Last error: Service Unavailable") |
| 777 | // The AI SDK already retried 4 times, but we still want our SDK wrapper to retry 3 more times |
| 778 | if ( |
| 779 | lowerMessage.includes('failed after') && |
| 780 | lowerMessage.includes('attempts') |
| 781 | ) { |
| 782 | // Extract the underlying error type from the message |
| 783 | if (lowerMessage.includes('service unavailable')) { |
| 784 | return 503 |
| 785 | } |
| 786 | if (lowerMessage.includes('timeout')) { |
| 787 | return 408 |
| 788 | } |
| 789 | if (lowerMessage.includes('connection refused')) { |
| 790 | return 503 |
| 791 | } |
| 792 | // Default to 500 for other AI SDK retry failures |
| 793 | return 500 |
| 794 | } |
| 795 | |
| 796 | if ( |
| 797 | errorMessage.includes('503') || |
| 798 | lowerMessage.includes('service unavailable') |
| 799 | ) { |
| 800 | return 503 |
| 801 | } |
| 802 | if (errorMessage.includes('504')) { |
| 803 | return 504 |
| 804 | } |
| 805 | if (errorMessage.includes('502')) { |
| 806 | return 502 |
| 807 | } |
| 808 | if (lowerMessage.includes('timeout') || errorMessage.includes('408')) { |
| 809 | return 408 |
| 810 | } |
| 811 | if ( |
| 812 | lowerMessage.includes('econnrefused') || |
| 813 | lowerMessage.includes('connection refused') |
| 814 | ) { |
| 815 | return 503 |
| 816 | } |
| 817 | if (lowerMessage.includes('dns') || lowerMessage.includes('enotfound')) { |
| 818 | return 503 |
| 819 | } |
| 820 | if (lowerMessage.includes('server error') || errorMessage.includes('500')) { |
| 821 | return 500 |
| 822 | } |
| 823 | if (errorMessage.includes('429') || lowerMessage.includes('rate limit')) { |
| 824 | return 429 |
| 825 | } |
| 826 | if ( |
| 827 | lowerMessage.includes('network error') || |
| 828 | lowerMessage.includes('fetch failed') |
no outgoing calls
no test coverage detected