2 new response fields
- UsageCompletionsResult.input_cache_write_30m_tokens
- DecisionsUsageResult.input_cache_write_30m_tokens
APIs / OpenAI
Breaking changes, deprecations and new fields in the OpenAI API, as they ship.
Usually ignored rather than rejected, so the call succeeds and does something subtly different.
await client.post("/…", {
// spend_control is now ignored, not rejected
spend_control: value,
});Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call.
// response.spend_control is now undefined const spend_control = response.spend_control;
Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.
switch (response.type) {
// existing branches …
// no branch for "prompt"
default:
throw new Error("unexpected type");
}No action needed unless you validate responses against a closed schema.
Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.
switch (response) {
// existing branches …
// no branch for "degraded"
default:
throw new Error("unexpected value");
}Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.
no longer guaranteed present; can now be null
// response.url may now be absent or null const url = response.url ?? fallback;
No action needed unless it is required.
Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.
switch (response) {
// existing branches …
// no branch for "AU_STORAGE_PROCESSING"
// no branch for "IN_STORAGE_PROCESSING"
// no branch for "JP_STORAGE_PROCESSING"
default:
throw new Error("unexpected value");
}No action needed unless it is required.
No action needed.
No action needed.
Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.
switch (response) {
// existing branches …
// no branch for "suspended"
default:
throw new Error("unexpected value");
}Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.
switch (response) {
// existing branches …
// no branch for "expired"
// no branch for "suspended"
default:
throw new Error("unexpected value");
}No action needed unless you validate responses against a closed schema.
Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.
switch (response) {
// existing branches …
// no branch for "ready"
default:
throw new Error("unexpected value");
}No action needed.
No action needed unless it is required.
No action needed unless you validate responses against a closed schema.
Serialization mismatch. Integer-to-string moves are the usual cause and the usual outage.
// payload.limit // was: integer|null // now: integer
Serialization mismatch. Integer-to-string moves are the usual cause and the usual outage.
// payload.after // was: null|string // now: string
The documented set of values is gone, so anything can appear. Every exhaustive switch and generated enum over this field is now incomplete.
A value you may have hardcoded is now rejected.
// sending "shitan" for voice is now rejected
Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.
switch (response) {
// existing branches …
// no branch for "billing_not_active"
default:
throw new Error("unexpected value");
}An unhandled branch in your error handling.
Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call.
// response.compute_units is now undefined const compute_units = response.compute_units;
No action needed.
No action needed.
No action needed.
No action needed unless you validate responses against a closed schema.
Serialization mismatch. Integer-to-string moves are the usual cause and the usual outage.
// payload.environment // was: null|object // now: null
A relaxation. Existing payloads are unaffected.
Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.
can now be null
// response.bytes may now be absent or null const bytes = response.bytes ?? fallback;
Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.
// response.choices[0].finish_reason may now be absent or null const finish_reason = response.choices[0].finish_reason ?? fallback;
No action needed unless you validate responses against a closed schema.
A value you may have hardcoded is now rejected.
// sending "aube" for voice is now rejected
An unhandled branch in your error handling.
Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.
switch (response) {
// existing branches …
// no branch for "organization_spend_limit_exceeded"
// no branch for "organization_usage_limit_exceeded"
// no branch for "project_spend_limit_exceeded"
default:
throw new Error("unexpected value");
}No action needed unless you validate responses against a closed schema.
No action needed.
A value you may have hardcoded is now rejected.
// sending "consent" for type is now rejected
Behavior shifts for every call that omits the field.
No action needed unless you validate responses against a closed schema.
Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.
// response.refusal may now be absent or null const refusal = response.refusal ?? fallback;
Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.
// response.first_id may now be absent or null const first_id = response.first_id ?? fallback;
Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.
// response.last_id may now be absent or null const last_id = response.last_id ?? fallback;
Usually ignored rather than rejected, so the call succeeds and does something subtly different.
await client.post("/…", {
// audio_sample is now ignored, not rejected
audio_sample: value,
});Usually ignored rather than rejected, so the call succeeds and does something subtly different.
await client.post("/…", {
// consent is now ignored, not rejected
consent: value,
});Usually ignored rather than rejected, so the call succeeds and does something subtly different.
await client.post("/…", {
// name is now ignored, not rejected
name: value,
});A value you may have hardcoded is now rejected.
no longer accepts "ultrafast"
// sending "ultrafast" for undefined is now rejected
Partial payloads are rejected.
await client.post("/…", {
// …
model: /* now required */,
});Still works today. This is the earliest warning you will get before it is removed.
Behavior shifts for every call that omits the field.
Behavior shifts for every call that omits the field.
This verb now 405s. The path still resolves, so a health check on the URL will not catch it.
// Was:
await client.request("POST", "/evals/{eval_id}/runs/{run_id}");
// Now: 405No action needed.
An unhandled branch in your error handling.
No action needed unless you validate responses against a closed schema.
No action needed.
Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.
// response.model may now be absent or null const model = response.model ?? fallback;
Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.
// response.name may now be absent or null const name = response.name ?? fallback;
Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.
// response.per_model_usage may now be absent or null const per_model_usage = response.per_model_usage ?? fallback;
Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.
// response.per_testing_criteria_results may now be absent or null const per_testing_criteria_results = response.per_testing_criteria_results ?? fallback;
Parse failure, or silent coercion depending on your client.
// payload.metadata.token_usage // was: integer|null // now: null|object
Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.
// response.choices[0].finish_reason may now be absent or null const finish_reason = response.choices[0].finish_reason ?? fallback;
Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.
can now return "gpt-6.1-sol"
switch (response) {
// existing branches …
// no branch for "gpt-6.1-sol"
default:
throw new Error("unexpected value");
}No action needed unless you validate responses against a closed schema.
No action needed unless it is required.