@@ -1256,6 +1256,9 @@ export class OpenAiNativeHandler extends BaseProvider implements SingleCompletio
12561256 for ( let attempt = 0 ; attempt < resumeMaxRetries ; attempt ++ ) {
12571257 try {
12581258 const resumeUrl = `${ baseUrl } /v1/responses/${ responseId } ?stream=true&starting_after=${ lastSeq } `
1259+ console . warn (
1260+ `[OpenAI Native] Resume attempt ${ attempt + 1 } /${ resumeMaxRetries } for response ${ responseId } (starting_after=${ lastSeq } )` ,
1261+ )
12591262 const res = await fetch ( resumeUrl , {
12601263 method : "GET" ,
12611264 headers : {
@@ -1295,9 +1298,17 @@ export class OpenAiNativeHandler extends BaseProvider implements SingleCompletio
12951298 } catch ( e ) {
12961299 // Resume stream failed mid-flight; reset and throw to retry
12971300 this . resumeCutoffSequence = undefined
1301+ console . warn (
1302+ `[OpenAI Native] Resume stream failed on attempt ${ attempt + 1 } /${ resumeMaxRetries } for ${ responseId } :` ,
1303+ e ,
1304+ )
12981305 throw e
12991306 }
1300- } catch {
1307+ } catch ( err ) {
1308+ console . warn (
1309+ `[OpenAI Native] Resume attempt ${ attempt + 1 } /${ resumeMaxRetries } failed for ${ responseId } :` ,
1310+ err ,
1311+ )
13011312 // Wait with backoff before next attempt
13021313 const delay = resumeBaseDelayMs * Math . pow ( 2 , attempt )
13031314 if ( delay > 0 ) {
@@ -1307,6 +1318,9 @@ export class OpenAiNativeHandler extends BaseProvider implements SingleCompletio
13071318 }
13081319
13091320 // Resume failed - begin polling fallback
1321+ console . warn (
1322+ `[OpenAI Native] Resume failed after ${ resumeMaxRetries } attempts for ${ responseId } ; falling back to polling.` ,
1323+ )
13101324 yield {
13111325 type : "status" ,
13121326 mode : "background" ,
@@ -1330,15 +1344,26 @@ export class OpenAiNativeHandler extends BaseProvider implements SingleCompletio
13301344 } )
13311345
13321346 if ( ! pollRes . ok ) {
1333- // transient; wait and retry
1347+ // Bail on permanent auth/permission failures
1348+ if ( pollRes . status === 401 || pollRes . status === 403 ) {
1349+ throw new Error ( `Background polling aborted (${ pollRes . status } ) for ${ responseId } ` )
1350+ }
1351+ // Log and retry for transient errors (rate limits, server errors, etc.)
1352+ console . warn (
1353+ `[OpenAI Native] Polling HTTP ${ pollRes . status } for ${ responseId } ; retrying in ${ pollIntervalMs } ms` ,
1354+ )
13341355 await new Promise ( ( r ) => setTimeout ( r , pollIntervalMs ) )
13351356 continue
13361357 }
13371358
13381359 let raw : any
13391360 try {
13401361 raw = await pollRes . json ( )
1341- } catch {
1362+ } catch ( err ) {
1363+ console . warn (
1364+ `[OpenAI Native] Polling JSON parse error for ${ responseId } ; retrying in ${ pollIntervalMs } ms` ,
1365+ err ,
1366+ )
13421367 await new Promise ( ( r ) => setTimeout ( r , pollIntervalMs ) )
13431368 continue
13441369 }
@@ -1415,8 +1440,13 @@ export class OpenAiNativeHandler extends BaseProvider implements SingleCompletio
14151440 if ( status === "failed" || status === "canceled" ) {
14161441 throw new Error ( `Response ${ status } : ${ respId || responseId } ` )
14171442 }
1418- } catch {
1419- // ignore transient poll errors
1443+ } catch ( err ) {
1444+ // Bail out on permanent failures propagated from above
1445+ if ( err instanceof Error && err . message . startsWith ( "Background polling aborted" ) ) {
1446+ throw err
1447+ }
1448+ // Otherwise, ignore transient poll errors but log for diagnosis
1449+ console . warn ( `[OpenAI Native] Polling error for ${ responseId } ; retrying` , err )
14201450 }
14211451
14221452 await new Promise ( ( r ) => setTimeout ( r , pollIntervalMs ) )
0 commit comments