{"record":{"id":"10a66f694c670070","repo":"can1357/oh-my-pi","slug":"formatcompactionv2failure-event-type","errorCode":null,"errorMessage":"formatCompactionV2Failure(event, type)","messagePattern":"formatCompactionV2Failure\\(event, type\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/agent/src/compaction/compaction-v2-streaming.ts","lineNumber":589,"sourceCode":"): void {\n\tconst type = typeof event.type === \"string\" ? event.type : eventName;\n\tif (type === \"response.output_item.done\") {\n\t\tstate.outputItemCount++;\n\t\tconst item = event.item;\n\t\tif (isRecord(item) && item.type === \"compaction\") {\n\t\t\tstate.compactionItems.push(item);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (type === \"response.completed\" || type === \"response.done\") {\n\t\tstate.sawCompleted = true;\n\t\tstate.usage = parseCompactionV2Usage(event);\n\t\treturn;\n\t}\n\n\tif (type === \"response.failed\" || type === \"response.incomplete\") {\n\t\tthrow new Error(formatCompactionV2Failure(event, type));\n\t}\n}\n\nfunction parseCompactionV2Usage(event: Record<string, unknown>): CompactionV2Usage | undefined {\n\tconst response = isRecord(event.response) ? event.response : undefined;\n\tconst usage = response && isRecord(response.usage) ? response.usage : undefined;\n\tif (!usage) return undefined;\n\n\tconst inputTokens = numberField(usage, \"input_tokens\");\n\tconst outputTokens = numberField(usage, \"output_tokens\");\n\tconst totalTokens = numberField(usage, \"total_tokens\");\n\tif (inputTokens === undefined || outputTokens === undefined || totalTokens === undefined) return undefined;\n\n\tconst inputDetails = isRecord(usage.input_tokens_details) ? usage.input_tokens_details : undefined;\n\tconst outputDetails = isRecord(usage.output_tokens_details) ? usage.output_tokens_details : undefined;\n\tconst cachedInputTokens = inputDetails ? numberField(inputDetails, \"cached_tokens\") : undefined;\n\tconst reasoningOutputTokens = outputDetails ? numberField(outputDetails, \"reasoning_tokens\") : undefined;\n\treturn {","sourceCodeStart":571,"sourceCodeEnd":607,"githubUrl":"https://github.com/can1357/oh-my-pi/blob/969062200754ea02cfac922e5ebb8c608c079e15/packages/agent/src/compaction/compaction-v2-streaming.ts#L571-L607","documentation":"The compaction stream delivered a response.failed or response.incomplete event; the library formats the failure details from the event (via formatCompactionV2Failure) and throws. This is the server explicitly reporting that the compaction response did not finish successfully, with the reason carried in the event payload.","triggerScenarios":"OpenAI Responses-style compaction emits response.failed (e.g. server_error, invalid_request, context length issues) or response.incomplete (output truncated, e.g. max_output_tokens hit) during the SSE stream.","commonSituations":"Compaction request exceeding the model's output/context limits; transient provider outage reported as server_error; invalid request fields after API version changes; incomplete output when the compaction summary is too large for max_output_tokens.","solutions":["Read the formatted message for the failure reason/code (e.g. server_error vs incomplete due to max_output_tokens)","For response.incomplete, reduce input size or raise output limits, then retry the compaction","For server_error/5xx-style failures, retry with backoff (retryWait option in requestCompactionV2Streaming)","For invalid_request errors, check API version and request fields (model id, instructions, tools) against the current compaction API","Fall back to local compaction when remote compaction repeatedly fails"],"exampleFix":"// before\nawait requestCompactionV2Streaming({ model, ... }); // incomplete: max_output_tokens\n// after\ntry {\n  await requestCompactionV2Streaming({ model, ... });\n} catch (err) {\n  if (String(err.message).includes(\"incomplete\")) {\n    await compactInSmallerChunks(session); // or fall back locally\n  } else throw err;\n}","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  return await requestCompactionV2Streaming({ model, ... });\n} catch (err) {\n  const msg = err instanceof Error ? err.message : String(err);\n  if (msg.includes(\"response.failed\") && /server_error|5\\d\\d/.test(msg)) {\n    await Bun.sleep(backoff);\n    return requestCompactionV2Streaming({ model, ... });\n  }\n  if (msg.includes(\"response.incomplete\")) {\n    return compactLocally(session); // or shrink input and retry\n  }\n  throw err;\n}","preventionTips":["Parse the formatted failure message for the provider error code before choosing retry vs fallback","Keep input within context/output limits to avoid response.incomplete","Retry only transient server errors; treat invalid_request as a config fix"],"tags":["compaction","openai","streaming","server-error","incomplete-response"],"backgroundTag":"llm-response-failed","analyzedSha":"969062200754ea02cfac922e5ebb8c608c079e15","analyzedAt":"2026-08-31T10:29:35.737Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}