cd /news/artificial-intelligence/additive-openai-2-new-response-field… · home › topics › artificial-intelligence › article
[ARTICLE · art-153128] src=driftwatch.et ↗ pub= topic=artificial-intelligence verified=true sentiment=· neutral

[Additive] OpenAI: 2 new response fields

OpenAI added two additive response fields, UsageCompletionsResult.input_cache_write_30m_tokens and DecisionsUsageResult.input_cache_write_30m_tokens, to its API, according to an API change tracker. The same tracker lists breaking changes shipped alongside them, including the removal of the spend_control response field and the spend_control parameter no longer being accepted in CreateAgentSessionParams and UpdateAgentSessionParams, plus new enum values such as "prompt" for VoiceResource.type and "degraded" for ExternalStorageStatus that break exhaustive switches and strict parsers. WebSearchActionFind.url and BetaWebSearchActionFind.url are no longer guaranteed present and can now be null.

read12 min views2 publishedOct 19, 2026
[Additive] OpenAI: 2 new response fields
Image: Driftwatch (auto-discovered)

OpenAI2 additive

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.

  • Breakingdirection flip: their tools call this safespend_control is no longer acceptedUsually ignored rather than rejected, so the call succeeds and does something subtly different. 2 places: CreateAgentSessionParams.spend_control, UpdateAgentSessionParams.spend_control## Code that breaks
await client.post("/…", {
  // spend_control is now ignored, not rejected
  spend_control: value,
});
  • BreakingResponse field spend_control removedReads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call. SessionResource.spend_control · reachable from 5 operations## Code that breaks
// response.spend_control is now undefined
const spend_control = response.spend_control;
  • Breakingdirection flip: their tools call this safetype can now return "prompt"Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. VoiceResource.type · reachable from 1 operation## Code that breaks
switch (response.type) {
  // existing branches …
  // no branch for "prompt"
  default:
    throw new Error("unexpected type");
}
  • AdditiveResponse field prompt addedNo action needed unless you validate responses against a closed schema. VoiceResource.prompt · reachable from 1 operation

  • Breakingdirection flip: their tools call this safevalue can now return "degraded"Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. ExternalStorageStatus · reachable from 4 operations## Code that breaks

switch (response) {
  // existing branches …
  // no branch for "degraded"
  default:
    throw new Error("unexpected value");
}
  • Breakingdirection flip: their tools call this safeResponse field url is no longer guaranteedProducer-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 2 places: BetaWebSearchActionFind.url, WebSearchActionFind.url## Code that breaks
// response.url may now be absent or null
const url = response.url ?? fallback;
  • WebSearchActionFind.url

  • BetaWebSearchActionFind.url

  • ImagesResponse.safety_identifier

  • ImageGenCompletedEvent.safety_identifier

  • ImageEditCompletedEvent.safety_identifier

  • CreateImageEditRequest.safety_identifier

  • CreateImageRequest.safety_identifier

  • EditImageBodyJsonParam.safety_identifier

  • AdditiveRequest property phase addedNo action needed unless it is required. DecisionInputMessage.phase · reachable from 1 operation

  • Error-2.param

  • Error-2.type

  • VideoResource.error.param

  • VideoResource.error.type

  • BetaResponseError.param

  • BetaResponseError.type

  • ResponseError.param

  • ResponseError.type

  • Breakingdirection flip: their tools call this safevalue can now return "AU_STORAGE_PROCESSING", "IN_STORAGE_PROCESSING", "JP_STORAGE_PROCESSING"Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. PublicProjectResidency · reachable from 5 operations## Code that breaks

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");
}
switch (response) {
  // existing branches …
  // no branch for "suspended"
  default:
    throw new Error("unexpected value");
}
  • Breakingdirection flip: their tools call this safevalue can now return "expired", "suspended"Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. SessionEnvironmentStatusResource · reachable from 2 operations## Code that breaks
switch (response) {
  // existing branches …
  // no branch for "expired"
  // no branch for "suspended"
  default:
    throw new Error("unexpected value");
}
  • AdditiveResponse field detailed_explanation addedNo action needed unless you validate responses against a closed schema. SafetyAlertResource.detailed_explanation · reachable from 1 operation

  • Breakingdirection flip: their tools call this safevalue can now return "ready"Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. EnvironmentStatusResource · reachable from 3 operations## Code that breaks

switch (response) {
  // existing branches …
  // no branch for "ready"
  default:
    throw new Error("unexpected value");
}
  • Additive/agents/environments addedNo action needed. /agents/environments

  • AdditiveRequest property environment_id addedNo action needed unless it is required. EnvironmentParamOpenaiHosted.environment_id · reachable from 1 operation

  • AdditiveResponse field spend_control addedNo action needed unless you validate responses against a closed schema. SessionResource.spend_control · reachable from 5 operations

  • CreateAgentSessionParams.spend_control

  • UpdateAgentSessionParams.spend_control

  • Breakinglimit changed typeSerialization mismatch. Integer-to-string moves are the usual cause and the usual outage. GET /agents · limit · 5 call sites## Code that breaks

// payload.limit
// was: integer|null
// now: integer
  • Breakingafter changed typeSerialization mismatch. Integer-to-string moves are the usual cause and the usual outage. GET /agents/sessions/{session_id}/artifacts · after## Code that breaks
// payload.after
// was: null|string
// now: string
  • Breakingdirection flip: their tools call this safeResponse values are no longer constrainedThe documented set of values is gone, so anything can appear. Every exhaustive switch and generated enum over this field is now incomplete. VoiceResource.type · reachable from 1 operation

  • Breakingvoice no longer accepts "shitan"A value you may have hardcoded is now rejected. LiveInitialSessionAudioOutputParam.voice · reachable from 2 operations## Code that breaks

// sending "shitan" for voice is now rejected
  • Breakingdirection flip: their tools call this safevalue can now return "billing_not_active"Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. SessionTurnErrorCodeResource · reachable from 6 operations## Code that breaks
switch (response) {
  // existing branches …
  // no branch for "billing_not_active"
  default:
    throw new Error("unexpected value");
}
// response.compute_units is now undefined
const compute_units = response.compute_units;
// payload.environment
// was: null|object
// now: null
  • MisalignmentErrorDetailsResource.review_target

  • BetaMisalignmentErrorDetailsResource.review_target

  • AdditiveRequest field now accepts nullA relaxation. Existing payloads are unaffected. LiveHostedShellToolInputParam.environment · reachable from 3 operations

  • Breakingdirection flip: their tools call this safeResponse field bytes is no longer guaranteedProducer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. can now be null 2 places: OpenAIFile.bytes, Upload.file.bytes## Code that breaks

// response.bytes may now be absent or null
const bytes = response.bytes ?? fallback;
  • Breakingdirection flip: their tools call this safeResponse field finish_reason is no longer guaranteedProducer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. CreateChatCompletionStreamResponse.choices[].finish_reason · reachable from 1 operation## Code that breaks
// response.choices[0].finish_reason may now be absent or null
const finish_reason = response.choices[0].finish_reason ?? fallback;
  • AdditiveResponse field audio addedNo action needed unless you validate responses against a closed schema. ChatCompletionStreamResponseDelta.audio · reachable from 1 operation

  • Breakingvoice no longer accepts "aube"A value you may have hardcoded is now rejected. LiveInitialSessionAudioOutputParam.voice · reachable from 2 operations## Code that breaks

// sending "aube" for voice is now rejected
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");
}
// sending "consent" for type is now rejected
  • BehavioralDefault value changedBehavior shifts for every call that omits the field. CreateVoiceFromConsentRequest.type · reachable from 1 operation

  • AdditiveResponse field type addedNo action needed unless you validate responses against a closed schema. VoiceResource.type · reachable from 1 operation

  • Breakingdirection flip: their tools call this safeResponse field refusal is no longer guaranteedProducer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. ChatCompletionResponseMessage.refusal · reachable from 4 operations## Code that breaks

// response.refusal may now be absent or null
const refusal = response.refusal ?? fallback;
  • Breakingdirection flip: their tools call this safeResponse field first_id is no longer guaranteedProducer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. ChatCompletionList.first_id · reachable from 1 operation## Code that breaks
// response.first_id may now be absent or null
const first_id = response.first_id ?? fallback;
  • Breakingdirection flip: their tools call this safeResponse field last_id is no longer guaranteedProducer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. ChatCompletionList.last_id · reachable from 1 operation## Code that breaks
// response.last_id may now be absent or null
const last_id = response.last_id ?? fallback;
  • Breakingdirection flip: their tools call this safeaudio_sample is no longer acceptedUsually ignored rather than rejected, so the call succeeds and does something subtly different. CreateVoiceRequest.audio_sample · reachable from 1 operation## Code that breaks
await client.post("/…", {
  // audio_sample is now ignored, not rejected
  audio_sample: value,
});
  • Breakingdirection flip: their tools call this safeconsent is no longer acceptedUsually ignored rather than rejected, so the call succeeds and does something subtly different. CreateVoiceRequest.consent · reachable from 1 operation## Code that breaks
await client.post("/…", {
  // consent is now ignored, not rejected
  consent: value,
});
  • Breakingdirection flip: their tools call this safename is no longer acceptedUsually ignored rather than rejected, so the call succeeds and does something subtly different. CreateVoiceRequest.name · reachable from 1 operation## Code that breaks
await client.post("/…", {
  // name is now ignored, not rejected
  name: value,
});
  • Breakingvalue no longer accepts "ultrafast"A value you may have hardcoded is now rejected. no longer accepts "ultrafast" 5 places: ServiceTierParam, CreateAgentParams.service_tier, SessionAgentConfigParam.service_tier, UpdateAgentParams.service_tier, UpdateSessionAgentParam.service_tier## Code that breaks
// sending "ultrafast" for undefined is now rejected
  • Breakingmodel is now requiredPartial payloads are rejected. 2 places: CreateImageEditRequest.model, CreateImageRequest.model## Code that breaks
await client.post("/…", {
  // …
  model: /* now required */,
});
  • DeprecationPOST /images/variations deprecatedStill works today. This is the earliest warning you will get before it is removed. POST /images/variations

  • BehavioralDefault value changedBehavior shifts for every call that omits the field. CreateImageEditRequest.size · reachable from 1 operation

  • BehavioralDefault value changedBehavior shifts for every call that omits the field. EditImageBodyJsonParam.model · reachable from 1 operation

  • BreakingPOST /evals/{eval_id}/runs/{run_id} removedThis verb now 405s. The path still resolves, so a health check on the URL will not catch it. POST /evals/{eval_id}/runs/{run_id}## Code that breaks

// Was:
await client.request("POST", "/evals/{eval_id}/runs/{run_id}");
// Now: 405
// response.model may now be absent or null
const model = response.model ?? fallback;
  • Breakingdirection flip: their tools call this safeResponse field name is no longer guaranteedProducer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. EvalRun.name · reachable from 4 operations## Code that breaks
// response.name may now be absent or null
const name = response.name ?? fallback;
  • Breakingdirection flip: their tools call this safeResponse field per_model_usage is no longer guaranteedProducer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. EvalRun.per_model_usage · reachable from 4 operations## Code that breaks
// response.per_model_usage may now be absent or null
const per_model_usage = response.per_model_usage ?? fallback;
// response.per_testing_criteria_results may now be absent or null
const per_testing_criteria_results = response.per_testing_criteria_results ?? fallback;
  • Breakingtoken_usage changed typeParse failure, or silent coercion depending on your client. RunGraderResponse.metadata.token_usage · reachable from 1 operation## Code that breaks
// payload.metadata.token_usage
// was: integer|null
// now: null|object
  • Breakingdirection flip: their tools call this safeResponse field finish_reason is no longer guaranteedProducer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. CreateCompletionResponse.choices[].finish_reason · reachable from 1 operation## Code that breaks
// response.choices[0].finish_reason may now be absent or null
const finish_reason = response.choices[0].finish_reason ?? fallback;
  • RunGraderResponse.metadata.token_usage.completion_tokens

  • RunGraderResponse.metadata.token_usage.cached_tokens

  • RunGraderResponse.metadata.token_usage.total_tokens

  • RunGraderResponse.metadata.token_usage.prompt_tokens

  • EnvironmentResourceOpenaiHosted.desktop

  • EnvironmentTemplateResource.desktop

  • NetworkPolicyParam.blocked_domains

  • EnvironmentParamOpenaiHosted.network.blocked_domains

  • CreateEnvironmentTemplateParams.desktop

  • UpdateEnvironmentTemplateParams.network.blocked_domains

  • UpdateEnvironmentTemplateParams.desktop

  • CreateEnvironmentTemplateParams.network.blocked_domains

  • EnvironmentParamOpenaiHosted.desktop

  • Breakingdirection flip: their tools call this safevalue can now return "gpt-6.1-sol"Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. can now return "gpt-6.1-sol" 2 places: BetaModelIdsShared, ModelIdsShared## Code that breaks

switch (response) {
  // existing branches …
  // no branch for "gpt-6.1-sol"
  default:
    throw new Error("unexpected value");
}
── more in #artificial-intelligence 4 stories · sorted by recency
── more on @openai 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/additive-openai-2-ne…] indexed:0 read:12min 2026-10-19 · —