Skip to content

Commit 987ee05

Browse files
committed
fix(openai-native): add resume logging and abort polling on 401/403; remove duplicate backgroundStatus test
1 parent d75e24f commit 987ee05

File tree

2 files changed

+35
-40
lines changed

2 files changed

+35
-40
lines changed

src/api/providers/openai-native.ts

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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))

webview-ui/src/utils/__tests__/backgroundStatus.test.ts

Lines changed: 0 additions & 35 deletions
This file was deleted.

0 commit comments

Comments
 (0)