linshenkx/prompt-optimizer · error · APIError
Responses API request failed
Error message
Responses API request failed
What it means
During Responses API streaming, the terminal 'response.failed' event fired: OpenAI accepted the request but the response generation failed server-side, so the adapter aborts with a generic APIError (response.failed carries no usable message here).
Source
Thrown at packages/core/src/services/llm/adapters/openai-adapter.ts:593
callbacks.onToolCall(currentToolCall)
} catch {
// Ignore incomplete JSON deltas until the payload becomes valid.
}
}
break
}
case 'response.completed': {
const completedResponse = event.response
if (!accumulatedContent && completedResponse?.output_text) {
accumulatedContent = completedResponse.output_text
}
if (!accumulatedReasoning) {
accumulatedReasoning = this.extractResponsesReasoning(completedResponse?.output)
}
break
}
case 'response.failed': {
throw new APIError('Responses API request failed')
}
case 'response.error': {
throw new APIError(event.error?.message || 'Responses API request failed')
}
default:
break
}
}
callbacks.onComplete({
content: accumulatedContent,
reasoning: accumulatedReasoning || undefined,
toolCalls: toolCalls.size > 0 ? Array.from(toolCalls.values()) : undefined,
metadata: {
model: config.modelMeta.id
}
})
}View on GitHub (pinned to 3e677b1d9f)
Solutions
- Simply retry the request — most response.failed events are transient
- If recurring, check status.openai.com and try a different model ID
- Inspect event.response.error in raw SSE for detail (adapter discards it)
- Add a fallback path to the chat-completions API if Responses is unstable for your workload
Example fix
// before
const stream = await adapter.sendMessageStream(msgs)
// after
async function robustStream(adapter, msgs, tries = 3) {
for (let i = 0; ; i++) {
try { return await adapter.sendMessageStream(msgs) }
catch (e) {
if (i < tries - 1 && e instanceof APIError && /Responses API request failed/.test(e.message)) continue
throw e
}
}
} Defensive patterns
Strategy: retry
Validate before calling
null
Type guard
function isResponsesFailed(e: unknown): boolean {
return e instanceof APIError && e.message === 'Responses API request failed'
} Try / catch
try { return await consume(adapter.sendMessageStream(msgs)) }
catch (e) {
if (isResponsesFailed(e) && retriesLeft) { await sleep(backoffMs); return retry() }
throw e
} Prevention
- Build retry-with-backoff around all streaming calls
- Have a chat-completions fallback path
- Watch provider status pages during incidents
When it happens
Trigger: Server-side failures during generation: internal errors, content-filter/system issues, or model crashes mid-response; happens after streaming has begun.
Common situations: OpenAI incidents, overloaded models, long generations timing out server-side, rarely reproducible transient failures.
Related errors
- ${providerErrorMessage}
- UNSUPPORTED_TEST_TYPE
- API returned empty model list
- Unexpected API response format
- Cross-origin connection failed: ${error.message}
AI-assisted analysis of linshenkx/prompt-optimizer@3e677b1d9f (2026-08-27).
Data as JSON: /api/errors/b869fdca816265e0.
Report an issue: GitHub.