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");
}
-
AdditiveRequest property scopes addedNo action needed unless it is required. UpdateProjectApiKeyBody.scopes · reachable from 1 operation
-
ImageGenToolCall.error
-
BetaImageGenToolCall.error
-
AdditivePOST /organization/projects/{project_id}/api_keys/{api_key_id} addedNo action needed. POST /organization/projects/{project_id}/api_keys/{api_key_id}
-
Additive/organization/usage/decisions addedNo action needed. /organization/usage/decisions
-
Breakingdirection flip: their tools call this safevalue can now return "suspended"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 "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");
}
-
Behavioral429 is now documented on /agents/environments/{environment_id}/filesAn unhandled branch in your error handling. POST /agents/environments/{environment_id}/files · 2 call sites
-
BreakingResponse field compute_units removedReads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call. ResponseUsageResource.compute_units · reachable from 1 operation## Code that breaks
// response.compute_units is now undefined
const compute_units = response.compute_units;
-
Additivemetadata is now optionalNo action needed. GET /vaults · metadata · 2 call sites
-
AdditivePOST /vaults/{vault_id} addedNo action needed. POST /vaults/{vault_id}
-
Additive/decisions addedNo action needed. /decisions
-
AdditiveResponse field cache_write_tokens addedNo action needed unless you validate responses against a closed schema. InputTokensDetailsResource.cache_write_tokens · reachable from 1 operation
-
Breakingenvironment changed typeSerialization mismatch. Integer-to-string moves are the usual cause and the usual outage. LiveHostedShellToolInputParam.environment · reachable from 3 operations## Code that breaks
// 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
-
Behavioral201 is now documented on /organization/invitesAn unhandled branch in your error handling. POST /organization/invites · 4 call sites
-
Breakingdirection flip: their tools call this safevalue can now return "organization_spend_limit_exceeded", "organization_usage_limit_exceeded", "project_spend_limit_exceeded"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 "organization_spend_limit_exceeded"
// no branch for "organization_usage_limit_exceeded"
// no branch for "project_spend_limit_exceeded"
default:
throw new Error("unexpected value");
}
-
AdditiveResponse field user_id addedNo action needed unless you validate responses against a closed schema. CostsResult.user_id · reachable from 11 operations
-
Additive/agents/sessions/{session_id}/turns/{turn_id}/items addedNo action needed. /agents/sessions/{session_id}/turns/{turn_id}/items
-
UsageWebSearchCallsResult.api_source
-
CostsResult.api_source
-
UsageCompletionsResult.api_source
-
Breakingtype no longer accepts "consent"A value you may have hardcoded is now rejected. CreateVoiceFromConsentRequest.type · reachable from 1 operation## Code that breaks
// 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
-
Additive/evals/{eval_id}/runs/{run_id}/cancel addedNo action needed. /evals/{eval_id}/runs/{run_id}/cancel
-
Behavioral502 is now documented on /live/sessionsAn unhandled branch in your error handling. POST /live/sessions
-
Behavioral504 is now documented on /live/sessions POST /live/sessions
-
AdditiveResponse field input_cache_write_12h_tokens addedNo action needed unless you validate responses against a closed schema. UsageCompletionsResult.input_cache_write_12h_tokens · reachable from 11 operations
-
Additive/agents/sessions/{session_id}/traces addedNo action needed. /agents/sessions/{session_id}/traces
-
Breakingdirection flip: their tools call this safeResponse field model is no longer guaranteedProducer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. EvalRun.model · reachable from 4 operations## Code that breaks
// 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;
- Breakingdirection flip: their tools call this safeResponse field per_testing_criteria_results 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_testing_criteria_results · reachable from 4 operations## Code that breaks
// 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");
}
- AdditiveResponse field container_size addedNo action needed unless you validate responses against a closed schema. EnvironmentResourceOpenaiHosted.container_size · reachable from 5 operations
- AdditiveRequest property container_size addedNo action needed unless it is required. EnvironmentParamOpenaiHosted.container_size · reachable from 1 operation