{"record":{"id":"c3f307c2be774b02","repo":"linshenkx/prompt-optimizer","slug":"providererrormessage","errorCode":null,"errorMessage":"${providerErrorMessage}","messagePattern":"\\$\\{providerErrorMessage\\}","errorType":"exception","errorClass":"APIError","httpStatus":null,"severity":"error","filePath":"packages/core/src/services/llm/adapters/openai-adapter.ts","lineNumber":524,"sourceCode":"    }\n\n    const stream = await openai.responses.create(responsesConfig)\n    let accumulatedContent = ''\n    let accumulatedReasoning = ''\n    const thinkState = { isInThinkMode: false, buffer: '' }\n    const toolCalls = new Map<number, any>()\n\n    for await (const event of stream as any) {\n      if (\n        event &&\n        typeof event === 'object' &&\n        !('type' in event) &&\n        typeof event.message === 'string'\n      ) {\n        const providerErrorMessage = typeof event.code === 'string'\n          ? `${event.code}: ${event.message}`\n          : event.message\n        throw new APIError(providerErrorMessage)\n      }\n\n      switch (event.type) {\n        case 'response.output_text.delta': {\n          const delta = event.delta || ''\n          if (delta) {\n            accumulatedContent += delta\n            this.processStreamContentWithThinkTags(delta, callbacks, thinkState)\n          }\n          break\n        }\n        case 'response.reasoning_text.delta':\n        case 'response.reasoning_summary_text.delta': {\n          const delta = event.delta || ''\n          if (delta) {\n            accumulatedReasoning += delta\n            callbacks.onReasoningToken?.(delta)\n          }","sourceCodeStart":506,"sourceCodeEnd":542,"githubUrl":"https://github.com/linshenkx/prompt-optimizer/blob/3e677b1d9f7e0493c142c175560531e7ae786dce/packages/core/src/services/llm/adapters/openai-adapter.ts#L506-L542","documentation":"While streaming an OpenAI Responses API request, an event arrived that has no 'type' field but a string 'message' — the adapter interprets this as a provider-side error event and throws APIError with 'code: message' if a code string is present.","triggerScenarios":"Streaming from an OpenAI-compatible gateway that emits non-standard SSE events (plain {message, code} objects without type), or a mid-stream server error pushed as a message event.","commonSituations":"Third-party Responses-API emitters that don't fully conform to OpenAI's event schema, gateways translating chat-completions errors mid-stream.","solutions":["Capture the SSE frames (code + message) to see the provider's real error (often auth/quota/model issues)","Fix the underlying reported error (key, model name, quota)","If the gateway is yours, emit proper response.error / response.failed typed events","Upgrade the gateway or adapter to a version aligned on the Responses event schema"],"exampleFix":"# before (gateway emits)\n{\"message\":\"Insufficient credits\",\"code\":\"billing\"}\n\n# after (gateway emits)\n{\"type\":\"response.error\",\"error\":{\"code\":\"billing\",\"message\":\"Insufficient credits\"}}","handlingStrategy":"try-catch","validationCode":"null","typeGuard":"function isUntypedStreamErrorEvent(e: any): boolean {\n  return e != null && !('type' in e) && typeof e.message === 'string'\n}","tryCatchPattern":"for await (const chunk of stream) { ... }\n// wrap the whole consumption:\ntry { await consume(adapter.sendMessageStream(msgs)) }\ncatch (e) {\n  if (e instanceof APIError && /^[\\w.-]+: /.test(e.message)) showProviderError(e.message)\n  else throw e\n}","preventionTips":["Use gateways that emit spec-compliant Responses API events","Capture raw SSE frames in dev to diagnose code:message errors","Fix auth/quota issues flagged by the provider's code prefix"],"tags":["openai","responses-api","streaming","sse"],"backgroundTag":"stream-error-event","analyzedSha":"3e677b1d9f7e0493c142c175560531e7ae786dce","analyzedAt":"2026-08-27T21:29:16.709Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}