Driftwatch

OpenAI / OpenAI API /

Breakingdirection flip: their tools call this safe

Response field refusal is no longer guaranteed

What changed

Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

Affects data[].refusal on ChatCompletionMessageList reachable from 1 operation. Nothing fails at the call; it fails wherever the value is finally used, which is usually somewhere else entirely.

no longer guaranteed present

Who is affected

Code that reads OpenAI's ChatCompletionMessageList objects, used by 5 OpenAI operations.

Before and after

WhereBeforeAfter
ChatCompletionMessageList.data[].refusalalways presentmay be missing
ChatCompletionResponseMessage.refusalalways presentmay be missing

Code that breaks

// response.data[0].refusal may now be absent or null
const refusal = response.data[0].refusal ?? fallback;

Based on OpenAI’s published API specification. How severity is decided.