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
| Where | Before | After |
|---|---|---|
| ChatCompletionMessageList.data[].refusal | always present | may be missing |
| ChatCompletionResponseMessage.refusal | always present | may 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.