1+ export interface APIError {
2+ statusCode ?: number
3+ message : string
4+ }
5+
6+ export function isRateLimitError ( error : any ) : boolean {
7+ return (
8+ error &&
9+ ( error . statusCode === 429 ||
10+ error . message . toLowerCase ( ) . includes ( 'limit' ) ||
11+ error . message . toLowerCase ( ) . includes ( 'billing' ) )
12+ )
13+ }
14+
15+ export function isOverloadedError ( error : any ) : boolean {
16+ return error && ( error . statusCode === 529 || error . statusCode === 503 )
17+ }
18+
19+ export function isAccessDeniedError ( error : any ) : boolean {
20+ return error && ( error . statusCode === 403 || error . statusCode === 401 )
21+ }
22+
23+ export function handleAPIError (
24+ error : any ,
25+ context ?: { hasOwnApiKey ?: boolean } ,
26+ ) : Response {
27+ // Log the error for debugging
28+ console . error ( 'API Error:' , error )
29+
30+ if ( isRateLimitError ( error ) ) {
31+ const message = context ?. hasOwnApiKey
32+ ? 'The provider is currently unavailable due to request limit.'
33+ : 'The provider is currently unavailable due to request limit. Try using your own API key.'
34+
35+ return new Response ( message , { status : 429 } )
36+ }
37+
38+ if ( isOverloadedError ( error ) ) {
39+ return new Response (
40+ 'The provider is currently unavailable. Please try again later.' ,
41+ { status : 529 } ,
42+ )
43+ }
44+
45+ if ( isAccessDeniedError ( error ) ) {
46+ return new Response (
47+ 'Access denied. Please make sure your API key is valid.' ,
48+ { status : 403 } ,
49+ )
50+ }
51+
52+ // Generic error handling
53+ return new Response (
54+ 'An unexpected error has occurred. Please try again later.' ,
55+ { status : 500 } ,
56+ )
57+ }
58+
59+ export function createRateLimitResponse ( limit : {
60+ amount : number
61+ remaining : number
62+ reset : number
63+ } ) : Response {
64+ return new Response ( 'You have reached your request limit for the day.' , {
65+ status : 429 ,
66+ headers : {
67+ 'X-RateLimit-Limit' : limit . amount . toString ( ) ,
68+ 'X-RateLimit-Remaining' : limit . remaining . toString ( ) ,
69+ 'X-RateLimit-Reset' : limit . reset . toString ( ) ,
70+ } ,
71+ } )
72+ }
0 commit comments