One section per release, oldest first. Start below the version you have and read down to the one you are moving to. Each section lists what breaks, the compiler errors it raises and what Emendant patches.
- 6.3.0: ComparisonFilter.value accepts arrays 1 breaking, 0 deprecations
- 6.9.0: batches accept the /v1/moderations endpoint 1 breaking, 0 deprecations
- 6.21.0: batches accept the image generation and edit endpoints 1 breaking, 0 deprecations
- 6.28.0: a video's input_reference can be an image reference object 1 breaking, 0 deprecations
- 6.29.0: chat audio voice accepts a custom voice object 1 breaking, 0 deprecations
- 6.30.1: batches accept the /v1/videos endpoint 1 breaking, 0 deprecations
- 6.31.0: ComparisonFilter adds the in and nin operators 1 breaking, 0 deprecations
- 6.35.0: prompt_cache_retention 'in-memory' becomes 'in_memory' 2 breaking, 0 deprecations
- 6.36.0: ClientOptions adds adminAPIKey, and apiKey may be null 2 breaking, 0 deprecations
- 6.37.0: image size accepts any WIDTHxHEIGHT string for gpt-image-2 4 breaking, 0 deprecations
- 6.49.0: prompt_cache_key and safety_identifier accept null 2 breaking, 0 deprecations
OpenAI Node SDK 6.3.0: ComparisonFilter.value accepts arrays
openai@6.3.0 prepares file search filters for in and not in comparisons. ComparisonFilter.value widens from a single string, number or boolean to also accept Array<string | number>. Filters written for 6.2.0 keep compiling. Code that reads value from a ComparisonFilter and treats it as a scalar is what breaks.
What changed
valuemay be an array. It wasstring | number | booleanand is nowstring | number | boolean | Array<string | number>. The changelog lists the release as “comparison filter in/not in.”- The operator list did not follow in the types. The doc comment on
typein 6.3.0 now listsinandnin, but the declared union is still'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte', so a filter withtype: 'in'does not type check in this release.
Before and after
The affected type is imported from this module:
import type { ComparisonFilter } from 'openai/resources';The member as openai@6.2.0 declared it:
value: string | number | boolean;And as 6.3.0 declares it:
value: string | number | boolean | Array<string | number>;Migration guidance and its limits
The finding carries an assisted fix at medium confidence. Name a model provider on the command line or in emendant.json and emendant fix tries it; without one it is reported with its guidance and nothing is sent anywhere. Review whether the changed members affect your code before applying a patch. Code that only builds filters may need no edit. Emendant checks each patch in a copy of your repository at 6.3.0 and withholds patches that fail. Read the patch header to see which checks passed.
Where code reads filter.value, for logging, for a comparison of its own or to serialise it, handle the array case with Array.isArray first.
The scan reports the name in a type position when it is imported from openai/resources. The type reached through openai/resources/shared, or on the OpenAI namespace, is not a finding. A clean scan says no file names ComparisonFilter from that module, and nothing more about the release.
What Emendant detects, fixes and verifies
1 change in openai 6.3.0. 0 automatic fixes, 1 fixes requiring a model provider you choose, 0 report only. Each patch states which checks passed. Understand patch evidence.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of ComparisonFilteropenai-npm-6.3.0-resources-comparison-filter-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
emendant explain <change-id> prints any row's entry, guidance and sources at the terminal.
Requires emendant@0.3.0 or later. Feed entry feed/npm/openai/6.3.0.json, snapshot 2026-09-23.4.
Primary sources
OpenAI Node SDK 6.9.0: batches accept the /v1/moderations endpoint
openai@6.9.0 lets a batch run moderation requests. BatchCreateParams.endpoint accepts '/v1/moderations' beside the four endpoints it already took. Batch requests written for 6.8.1 keep compiling. Code that reads endpoint back from a BatchCreateParams object and expects one of the old four values is what breaks.
What changed
endpointaccepts'/v1/moderations'. The member was'/v1/responses' | '/v1/chat/completions' | '/v1/embeddings' | '/v1/completions'and is now the same union with'/v1/moderations'added. Its documentation lists the new endpoint as supported.
Before and after
The affected type is imported from this module:
import type { BatchCreateParams } from 'openai/resources';The member as openai@6.8.1 declared it:
endpoint: '/v1/responses' | '/v1/chat/completions' | '/v1/embeddings' | '/v1/completions';And as 6.9.0 declares it:
endpoint: '/v1/responses' | '/v1/chat/completions' | '/v1/embeddings' | '/v1/completions' | '/v1/moderations';Migration guidance and its limits
The finding carries an assisted fix at medium confidence. Name a model provider on the command line or in emendant.json and emendant fix tries it. Without one, it is reported with its guidance and nothing is sent anywhere. Review whether the changed members affect your code before applying a patch. Code that only builds batch requests may need no edit. Emendant checks each patch in a copy of your repository at 6.9.0 and withholds patches that fail. Read the patch header to see which checks passed.
Where code switches over params.endpoint exhaustively, or maps each endpoint to a handler in a type keyed by the old union, add '/v1/moderations'.
The scan reports BatchCreateParams in a type position when it is imported from openai/resources. The release’s GPT-5.1 additions are not covered. A clean scan says no file names BatchCreateParams from openai/resources, and nothing more about the release.
What Emendant detects, fixes and verifies
1 change in openai 6.9.0. 0 automatic fixes, 1 fixes requiring a model provider you choose, 0 report only. Each patch states which checks passed. Understand patch evidence.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of BatchCreateParamsopenai-npm-6.9.0-resources-batch-create-params-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
emendant explain <change-id> prints any row's entry, guidance and sources at the terminal.
Requires emendant@0.3.0 or later. Feed entry feed/npm/openai/6.9.0.json, snapshot 2026-09-23.4.
Primary sources
OpenAI Node SDK 6.21.0: batches accept the image generation and edit endpoints
openai@6.21.0 adds support for images in the Batch API. BatchCreateParams.endpoint gains two values, /v1/images/generations and /v1/images/edits. Batch requests written for 6.20.0 keep compiling. Code that reads endpoint from a BatchCreateParams value and handles each endpoint by name is what can break.
What changed
endpointhas two more values. It was'/v1/responses' | '/v1/chat/completions' | '/v1/embeddings' | '/v1/completions' | '/v1/moderations'and now also admits'/v1/images/generations'and'/v1/images/edits'. The member’s documentation lists all seven as supported.
Before and after
The affected type is imported from this module:
import type { BatchCreateParams } from 'openai/resources';The member as openai@6.20.0 declared it:
endpoint: '/v1/responses' | '/v1/chat/completions' | '/v1/embeddings' | '/v1/completions' | '/v1/moderations';And as 6.21.0 declares it:
endpoint: '/v1/responses' | '/v1/chat/completions' | '/v1/embeddings' | '/v1/completions' | '/v1/moderations' | '/v1/images/generations' | '/v1/images/edits';Migration guidance and its limits
The finding carries an assisted fix at medium confidence. Name a model provider on the command line or in emendant.json and emendant fix tries it; without one it is reported with its guidance and nothing is sent anywhere. Review whether the changed members affect your code before applying a patch. Code that only creates batches may need no edit. Emendant checks each patch in a copy of your repository at 6.21.0 and withholds patches that fail. Read the patch header to see which checks passed.
Look for code that switches on a batch’s endpoint, for example to choose how to parse its output file, or that checks it for exhaustiveness. Add the two image endpoints there.
The scan reports the name in a type position when it is imported from openai/resources. The type reached through openai/resources/batches, or on the OpenAI namespace, is not a finding. A clean scan says no file names BatchCreateParams from that module, and nothing more about the release.
What Emendant detects, fixes and verifies
1 change in openai 6.21.0. 0 automatic fixes, 1 fixes requiring a model provider you choose, 0 report only. Each patch states which checks passed. Understand patch evidence.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of BatchCreateParamsopenai-npm-6.21.0-resources-batch-create-params-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
emendant explain <change-id> prints any row's entry, guidance and sources at the terminal.
Requires emendant@0.3.0 or later. Feed entry feed/npm/openai/6.21.0.json, snapshot 2026-09-23.4.
Primary sources
OpenAI Node SDK 6.28.0: a video's input_reference can be an image reference object
openai@6.28.0 ships the Sora API improvements its changelog lists, among them character and video extension support. VideoCreateParams.input_reference, which was an upload, can now also be an ImageInputReferenceParam naming a file id or an image URL. Video requests written for 6.27.0 keep compiling. Code that reads input_reference back and treats it as an upload is what breaks.
What changed
input_referencetakes a reference object. It wasUploadableand is nowUploadable | ImageInputReferenceParam.ImageInputReferenceParamhas an optionalfile_idand an optionalimage_url, which its documentation describes as a fully qualified URL or a base64 data URL. The member’s own documentation changes from “multipart reference asset” to “reference asset upload or reference object.”
Before and after
The affected type is imported from this module:
import type { VideoCreateParams } from 'openai/resources';The member as openai@6.27.0 declared it:
input_reference?: Uploadable;And as 6.28.0 declares it:
input_reference?: Uploadable | ImageInputReferenceParam;Migration guidance and its limits
The finding carries an assisted fix at medium confidence. Name a model provider on the command line or in emendant.json and emendant fix tries it; without one it is reported with its guidance and nothing is sent anywhere. Review whether the changed members affect your code before applying a patch. Code that only creates videos may need no edit. Emendant checks each patch in a copy of your repository at 6.28.0 and withholds patches that fail. Read the patch header to see which checks passed.
Where code reads params.input_reference, for example to log its name or to stream it somewhere of your own, test for the object form before treating it as a file.
The scan reports the name in a type position when it is imported from openai/resources. The type reached through openai/resources/videos, or on the OpenAI namespace, is not a finding. The changelog also removes a detail field from ResponseInputFile and ResponseInputFileContent in this release; that has no row here and is not detected. A clean scan says no file names VideoCreateParams from that module, and nothing more about the release.
What Emendant detects, fixes and verifies
1 change in openai 6.28.0. 0 automatic fixes, 1 fixes requiring a model provider you choose, 0 report only. Each patch states which checks passed. Understand patch evidence.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of VideoCreateParamsopenai-npm-6.28.0-resources-video-create-params-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
emendant explain <change-id> prints any row's entry, guidance and sources at the terminal.
Requires emendant@0.3.0 or later. Feed entry feed/npm/openai/6.28.0.json, snapshot 2026-09-23.4.
Primary sources
OpenAI Node SDK 6.29.0: chat audio voice accepts a custom voice object
openai@6.29.0 adds custom voices. ChatCompletionAudioParam.voice could be any string before, and can now also be an object with an id. Audio requests written for 6.28.0 keep compiling. Code that reads voice from a ChatCompletionAudioParam and uses it as a string is what breaks.
What changed
voicemay be{ id: string }. The member’s type addsChatCompletionAudioParam.ID, an interface with a singleid. Its documentation gives{ "id": "voice_1234" }as the example. The built-in voice names are still accepted as strings.
Before and after
The affected type is imported from this module:
import type { ChatCompletionAudioParam } from 'openai/resources';The member as openai@6.28.0 declared it:
voice: (string & {}) | 'alloy' | 'ash' | 'ballad' | 'coral' | 'echo' | 'sage' | 'shimmer' | 'verse' | 'marin' | 'cedar';And as 6.29.0 declares it:
voice: string | 'alloy' | 'ash' | 'ballad' | 'coral' | 'echo' | 'sage' | 'shimmer' | 'verse' | 'marin' | 'cedar' | ChatCompletionAudioParam.ID;Migration guidance and its limits
The finding carries an assisted fix at medium confidence. Name a model provider on the command line or in emendant.json and emendant fix tries it; without one it is reported with its guidance and nothing is sent anywhere. Review whether the changed members affect your code before applying a patch. Code that only sends audio requests may need no edit. Emendant checks each patch in a copy of your repository at 6.29.0 and withholds patches that fail. Read the patch header to see which checks passed.
Where code reads audio.voice, to display it, compare it with a name or pass it to a function typed for strings, check typeof voice === 'string' first and handle the custom voice’s id in the other branch.
The scan reports the name in a type position when it is imported from openai/resources. The type reached through openai/resources/chat/completions, or on the OpenAI namespace, is not a finding. A clean scan says no file names ChatCompletionAudioParam from that module, and nothing more about the release.
What Emendant detects, fixes and verifies
1 change in openai 6.29.0. 0 automatic fixes, 1 fixes requiring a model provider you choose, 0 report only. Each patch states which checks passed. Understand patch evidence.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of ChatCompletionAudioParamopenai-npm-6.29.0-resources-chat-completion-audio-param-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
emendant explain <change-id> prints any row's entry, guidance and sources at the terminal.
Requires emendant@0.3.0 or later. Feed entry feed/npm/openai/6.29.0.json, snapshot 2026-09-23.4.
Primary sources
OpenAI Node SDK 6.30.1: batches accept the /v1/videos endpoint
openai@6.30.1 lets a batch run video requests. BatchCreateParams.endpoint accepts '/v1/videos' beside the seven endpoints it already took. Batch requests written for 6.29.0 keep compiling. Code that reads endpoint back from a BatchCreateParams object and expects one of the old values is what breaks.
What changed
endpointaccepts'/v1/videos'. The member ended in'/v1/images/generations' | '/v1/images/edits'and now ends in'/v1/images/generations' | '/v1/images/edits' | '/v1/videos'.- The change is in 6.30.0. The changelog lists “add /v1/videos endpoint option to batches” under 6.30.0. The registry has no 6.30.0, so 6.30.1 is the first release a user can install with it, and the feed compares 6.30.1 with 6.29.0 for that reason.
Before and after
The affected type is imported from this module:
import type { BatchCreateParams } from 'openai/resources';The member as openai@6.29.0 declared it:
endpoint: '/v1/responses' | '/v1/chat/completions' | '/v1/embeddings' | '/v1/completions' | '/v1/moderations' | '/v1/images/generations' | '/v1/images/edits';And as 6.30.1 declares it:
endpoint: '/v1/responses' | '/v1/chat/completions' | '/v1/embeddings' | '/v1/completions' | '/v1/moderations' | '/v1/images/generations' | '/v1/images/edits' | '/v1/videos';Migration guidance and its limits
The finding carries an assisted fix at medium confidence. Name a model provider on the command line or in emendant.json and emendant fix tries it. Without one, it is reported with its guidance and nothing is sent anywhere. Review whether the changed members affect your code before applying a patch. Code that only builds batch requests may need no edit. Emendant checks each patch in a copy of your repository at 6.30.1 and withholds patches that fail. Read the patch header to see which checks passed.
Where code switches over params.endpoint exhaustively, or maps each endpoint to a handler in a type keyed by the old union, add '/v1/videos'.
The scan reports BatchCreateParams in a type position when it is imported from openai/resources. The defer_loading field the same release adds to NamespaceTool is not covered. A clean scan says no file names BatchCreateParams from openai/resources, and nothing more about the release.
What Emendant detects, fixes and verifies
1 change in openai 6.30.1. 0 automatic fixes, 1 fixes requiring a model provider you choose, 0 report only. Each patch states which checks passed. Understand patch evidence.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of BatchCreateParamsopenai-npm-6.30.1-resources-batch-create-params-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
emendant explain <change-id> prints any row's entry, guidance and sources at the terminal.
Requires emendant@0.3.0 or later. Feed entry feed/npm/openai/6.30.1.json, snapshot 2026-09-23.4.
Primary sources
OpenAI Node SDK 6.31.0: ComparisonFilter adds the in and nin operators
openai@6.31.0 adds set membership to attribute filters. ComparisonFilter.type accepts 'in' and 'nin' beside the six comparison operators it already took. Filters written for 6.30.1 keep compiling. Code that reads type from a ComparisonFilter, for example to translate filters into another query language, is what breaks.
What changed
typeaccepts'in'and'nin'. The member was'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte'and is now'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'nin'. Its documentation describes them as “in” and “not in”. The changelog lists it as “add in/nin filter types to ComparisonFilter”.valueis unchanged. It was alreadystring | number | boolean | Array<string | number>in 6.30.1, so an array value needs no new type.
Before and after
The affected type is imported from this module:
import type { ComparisonFilter } from 'openai/resources';The member as openai@6.30.1 declared it:
type: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte';And as 6.31.0 declares it:
type: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'nin';Migration guidance and its limits
The finding carries an assisted fix at medium confidence. Name a model provider on the command line or in emendant.json and emendant fix tries it. Without one, it is reported with its guidance and nothing is sent anywhere. Review whether the changed members affect your code before applying a patch. Code that only builds filters may need no edit. Emendant checks each patch in a copy of your repository at 6.31.0 and withholds patches that fail. Read the patch header to see which checks passed.
Where code switches over filter.type exhaustively, or keeps a lookup table typed by the old operators, add 'in' and 'nin'.
The scan reports ComparisonFilter in a type position when it is imported from openai/resources. A filter nested inside a CompoundFilter, or passed inline to a search call, is not a finding. A clean scan says no file names ComparisonFilter from openai/resources, and nothing more about the release.
What Emendant detects, fixes and verifies
1 change in openai 6.31.0. 0 automatic fixes, 1 fixes requiring a model provider you choose, 0 report only. Each patch states which checks passed. Understand patch evidence.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of ComparisonFilteropenai-npm-6.31.0-resources-comparison-filter-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
emendant explain <change-id> prints any row's entry, guidance and sources at the terminal.
Requires emendant@0.3.0 or later. Feed entry feed/npm/openai/6.31.0.json, snapshot 2026-09-23.4.
Primary sources
OpenAI Node SDK 6.35.0: prompt_cache_retention 'in-memory' becomes 'in_memory'
openai@6.35.0 corrects an enum value. prompt_cache_retention on chat completion requests accepted 'in-memory' and now accepts 'in_memory' instead, with '24h' unchanged. A request written for 6.34.0 that passes 'in-memory' stops compiling after the upgrade. The changelog lists it as a fix to the types in chat/completions and responses.
What changed
'in-memory'is now'in_memory'. OnChatCompletionCreateParamsNonStreamingandChatCompletionCreateParamsStreaming, the member was'in-memory' | '24h' | nulland is now'in_memory' | '24h' | null. The spelling with a hyphen is gone rather than kept as an alias.- The Responses API types use the same spelling.
prompt_cache_retentioninresources/responses/responses.d.tsis'in_memory' | '24h' | nullin 6.35.0. The feed’s rows cover the two chat completion types only.
Before and after
The affected type is imported from this module:
import type { ChatCompletionCreateParamsNonStreaming } from 'openai/resources';The member as openai@6.34.0 declared it:
prompt_cache_retention?: 'in-memory' | '24h' | null;And as 6.35.0 declares it:
prompt_cache_retention?: 'in_memory' | '24h' | null;Migration guidance and its limits
Both findings carry an assisted fix at medium confidence. Name a model provider on the command line or in emendant.json and emendant fix tries them. Without one, they are reported with their guidance and nothing is sent anywhere. Review whether the changed members affect your code before applying a patch. Emendant checks each patch in a copy of your repository at 6.35.0 and withholds patches that fail. Read the patch header to see which checks passed.
Where code passes prompt_cache_retention: 'in-memory', change the value to 'in_memory'. The same edit applies to a Responses API request, which the feed does not report.
The scan reports the two names in a type position when they are imported from openai/resources. A request passed inline to client.chat.completions.create, whose type is inferred, is not a finding, although the compiler still reports the old value. A clean scan says no file names these types from openai/resources, and nothing more about the release.
What Emendant detects, fixes and verifies
2 changes in openai 6.35.0. 0 automatic fixes, 2 fixes requiring a model provider you choose, 0 report only. Each patch states which checks passed. Understand patch evidence.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of ChatCompletionCreateParamsNonStreamingopenai-npm-6.35.0-resources-chat-completion-create-params-non-streaming-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
Changed the members of ChatCompletionCreateParamsStreamingopenai-npm-6.35.0-resources-chat-completion-create-params-streaming-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
emendant explain <change-id> prints any row's entry, guidance and sources at the terminal.
Requires emendant@0.3.0 or later. Feed entry feed/npm/openai/6.35.0.json, snapshot 2026-09-23.4.
Primary sources
OpenAI Node SDK 6.36.0: ClientOptions adds adminAPIKey, and apiKey may be null
openai@6.36.0 adds support for Admin API keys and an admin resource on the client. ClientOptions gains adminAPIKey, which defaults to the OPENAI_ADMIN_KEY environment variable. apiKey now accepts null, so a client can be built with only an admin key. Clients constructed as in 6.35.0 keep compiling. Code that reads apiKey back from the options, or from the client, and uses it as a string is what breaks.
What changed
ClientOptions.apiKeyacceptsnull. It wasstring | ApiKeySetter | undefinedand is nowstring | ApiKeySetter | null | undefined.ClientOptions.adminAPIKeyis new. It is optional, typedstring | null | undefined, and read fromprocess.env['OPENAI_ADMIN_KEY']when not given.- The client’s own fields follow. On the
OpenAIclass,apiKeywasstringand is nowstring | null, and a newadminAPIKeyfield isstring | null. The feed’s rows coverClientOptions, whichopenaiandopenai/clientboth export, so the table lists two.
Before and after
The affected type is imported from this module:
import type { ClientOptions } from 'openai';The member as openai@6.35.0 declared it:
apiKey?: string | ApiKeySetter | undefined;And the members as 6.36.0 declares them:
apiKey?: string | ApiKeySetter | null | undefined; adminAPIKey?: string | null | undefined;Migration guidance and its limits
Both findings carry an assisted fix at medium confidence. Name a model provider on the command line or in emendant.json and emendant fix tries them. Without one, they are reported with their guidance and nothing is sent anywhere. Review whether the changed members affect your code before applying a patch. Code that only builds options may need no edit. Emendant checks each patch in a copy of your repository at 6.36.0 and withholds patches that fail. Read the patch header to see which checks passed.
Where code reads options.apiKey or client.apiKey and passes it on as a string, handle null. Code that wraps ClientOptions in its own configuration type may want to pass adminAPIKey through.
The scan reports ClientOptions in a type position when it is imported from openai or openai/client. A read of client.apiKey on an OpenAI instance is not a finding, although the compiler reports it. The admin resource and the new pagination type are not covered. A clean scan says no file names ClientOptions from those two modules, and nothing more about the release.
What Emendant detects, fixes and verifies
2 changes in openai 6.36.0. 0 automatic fixes, 2 fixes requiring a model provider you choose, 0 report only. Each patch states which checks passed. Understand patch evidence.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of ClientOptionsopenai-npm-6.36.0-client-options-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
Changed the members of ClientOptionsopenai-npm-6.36.0-client-client-options-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
emendant explain <change-id> prints any row's entry, guidance and sources at the terminal.
Requires emendant@0.3.0 or later. Feed entry feed/npm/openai/6.36.0.json, snapshot 2026-09-23.4.
Primary sources
OpenAI Node SDK 6.37.0: image size accepts any WIDTHxHEIGHT string for gpt-image-2
openai@6.37.0 adds the gpt-image-2 models, which accept arbitrary resolutions. To carry them, size on image generation and edit requests is widened from a fixed list of sizes to any string, with the list kept for autocompletion. Requests written for 6.36.0 keep compiling. Code that reads size back from a params object and expects one of the listed values is what breaks.
What changed
sizeaccepts any string. OnImageGenerateParamsNonStreamingandImageGenerateParamsStreaming, and onImageEditParamsNonStreamingandImageEditParamsStreaming, the member’s union gains(string & {}). Its documentation saysgpt-image-2andgpt-image-2-2026-04-21takeWIDTHxHEIGHTstrings such as1536x864, with both sides divisible by 16 and a maximum of3840x2160.ImageModellists the new models. It gains'gpt-image-2','gpt-image-2-2026-04-21'and'chatgpt-image-latest'. The changelog also lists “fix imagegensizeenum regression” for this release.
Before and after
The affected type is imported from this module:
import type { ImageGenerateParamsNonStreaming } from 'openai/resources';The member on the generate params as openai@6.36.0 declared it:
size?: 'auto' | '1024x1024' | '1536x1024' | '1024x1536' | '256x256' | '512x512' | '1792x1024' | '1024x1792' | null;And as 6.37.0 declares it:
size?: (string & {}) | 'auto' | '1024x1024' | '1536x1024' | '1024x1536' | '256x256' | '512x512' | '1792x1024' | '1024x1792' | null;Migration guidance and its limits
All four findings carry an assisted fix at medium confidence. Name a model provider on the command line or in emendant.json and emendant fix tries them. Without one, they are reported with their guidance and nothing is sent anywhere. Review whether the changed members affect your code before applying a patch. Code that only builds requests may need no edit. Emendant checks each patch in a copy of your repository at 6.37.0 and withholds patches that fail. Read the patch header to see which checks passed.
Where code switches over params.size, or passes it to something typed with the listed sizes, add a branch for other strings. The compiler no longer rejects a size a model does not support, so a request built from input needs its own check against the documented limits.
The scan reports the four names in a type position when they are imported from openai/resources. A request passed inline to an images method is not a finding. A clean scan says no file names these types from openai/resources, and nothing more about the release.
What Emendant detects, fixes and verifies
4 changes in openai 6.37.0. 0 automatic fixes, 4 fixes requiring a model provider you choose, 0 report only. Each patch states which checks passed. Understand patch evidence.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of ImageEditParamsNonStreamingopenai-npm-6.37.0-resources-image-edit-params-non-streaming-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
Changed the members of ImageEditParamsStreamingopenai-npm-6.37.0-resources-image-edit-params-streaming-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
Changed the members of ImageGenerateParamsNonStreamingopenai-npm-6.37.0-resources-image-generate-params-non-streaming-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
Changed the members of ImageGenerateParamsStreamingopenai-npm-6.37.0-resources-image-generate-params-streaming-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
emendant explain <change-id> prints any row's entry, guidance and sources at the terminal.
Requires emendant@0.3.0 or later. Feed entry feed/npm/openai/6.37.0.json, snapshot 2026-09-23.4.
Primary sources
OpenAI Node SDK 6.49.0: prompt_cache_key and safety_identifier accept null
openai@6.49.0 accepts null for two chat completion request fields, prompt_cache_key and safety_identifier. The changelog lists it as “accept None for prompt_cache_key/safety_identifier”. Requests written for 6.48.0 keep compiling. Code that reads either field back from a params object and uses it as a string is what breaks.
What changed
- Both fields are
string | null. OnChatCompletionCreateParamsNonStreamingandChatCompletionCreateParamsStreaming,prompt_cache_keyandsafety_identifierwerestringand are nowstring | null. Both are still optional. - The Responses API types changed the same way.
resources/responses/responses.d.tsdeclares both fields asstring | nullin 6.49.0. The feed’s rows cover the two chat completion types only.
Before and after
The affected type is imported from this module:
import type { ChatCompletionCreateParamsNonStreaming } from 'openai/resources';The members as openai@6.48.0 declared them:
prompt_cache_key?: string; safety_identifier?: string;And as 6.49.0 declares them:
prompt_cache_key?: string | null; safety_identifier?: string | null;Migration guidance and its limits
Both findings carry an assisted fix at medium confidence. Name a model provider on the command line or in emendant.json and emendant fix tries them. Without one, they are reported with their guidance and nothing is sent anywhere. Review whether the changed members affect your code before applying a patch. Code that only builds requests may need no edit. Emendant checks each patch in a copy of your repository at 6.49.0 and withholds patches that fail. Read the patch header to see which checks passed.
Where code reads params.prompt_cache_key or params.safety_identifier and passes it on as a string, handle null as well as undefined. Code that sets them needs no change.
The scan reports the two names in a type position when they are imported from openai/resources. The same read on a Responses API request is not a finding. The release’s standard schema and Zod helper additions are not covered. A clean scan says no file names these types from openai/resources, and nothing more about the release.
What Emendant detects, fixes and verifies
2 changes in openai 6.49.0. 0 automatic fixes, 2 fixes requiring a model provider you choose, 0 report only. Each patch states which checks passed. Understand patch evidence.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of ChatCompletionCreateParamsNonStreamingopenai-npm-6.49.0-resources-chat-completion-create-params-non-streaming-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
Changed the members of ChatCompletionCreateParamsStreamingopenai-npm-6.49.0-resources-chat-completion-create-params-streaming-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
emendant explain <change-id> prints any row's entry, guidance and sources at the terminal.
Requires emendant@0.3.0 or later. Feed entry feed/npm/openai/6.49.0.json, snapshot 2026-09-23.4.
Primary sources
Scan your repository
Find affected code without editing your files.
npx emendant scanThen npx emendant fix writes the patches the tables say exist. Run emendant feed update first to get the latest coverage. The getting started guide covers the flags and the patch grades.
Related release pages
- OpenAI Node SDK 7.x breaking changes: 7.2.0 to 7.12.1
- OpenAI Node SDK 5.x breaking changes: 5.4.0 to 5.18.0
- OpenAI Node SDK 5.0.0: what breaks when you upgrade openai from 4.x
The OpenAI Node SDK migration guide lists every release page and says which to read for your upgrade.