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.

  1. 6.3.0: ComparisonFilter.value accepts arrays 1 breaking, 0 deprecations
  2. 6.9.0: batches accept the /v1/moderations endpoint 1 breaking, 0 deprecations
  3. 6.21.0: batches accept the image generation and edit endpoints 1 breaking, 0 deprecations
  4. 6.28.0: a video's input_reference can be an image reference object 1 breaking, 0 deprecations
  5. 6.29.0: chat audio voice accepts a custom voice object 1 breaking, 0 deprecations
  6. 6.30.1: batches accept the /v1/videos endpoint 1 breaking, 0 deprecations
  7. 6.31.0: ComparisonFilter adds the in and nin operators 1 breaking, 0 deprecations
  8. 6.35.0: prompt_cache_retention 'in-memory' becomes 'in_memory' 2 breaking, 0 deprecations
  9. 6.36.0: ClientOptions adds adminAPIKey, and apiKey may be null 2 breaking, 0 deprecations
  10. 6.37.0: image size accepts any WIDTHxHEIGHT string for gpt-image-2 4 breaking, 0 deprecations
  11. 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 released Published Updated

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

  • value may be an array. It was string | number | boolean and is now string | 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 type in 6.3.0 now lists in and nin, but the declared union is still 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte', so a filter with type: '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.

ChangeSeverityDetectsFixVerified by
Changed the members of ComparisonFilter
openai-npm-6.3.0-resources-comparison-filter-members-changed
Breaking
medium confidence
  • ComparisonFilter imported from openai/resources, named in any type position
Patch, only when you name a model providerYour 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 released Published Updated

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

  • endpoint accepts '/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.

ChangeSeverityDetectsFixVerified by
Changed the members of BatchCreateParams
openai-npm-6.9.0-resources-batch-create-params-members-changed
Breaking
medium confidence
  • BatchCreateParams imported from openai/resources, named in any type position
Patch, only when you name a model providerYour 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 released Published Updated

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

  • endpoint has 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.

ChangeSeverityDetectsFixVerified by
Changed the members of BatchCreateParams
openai-npm-6.21.0-resources-batch-create-params-members-changed
Breaking
medium confidence
  • BatchCreateParams imported from openai/resources, named in any type position
Patch, only when you name a model providerYour 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 released Published Updated

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_reference takes a reference object. It was Uploadable and is now Uploadable | ImageInputReferenceParam. ImageInputReferenceParam has an optional file_id and an optional image_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.

ChangeSeverityDetectsFixVerified by
Changed the members of VideoCreateParams
openai-npm-6.28.0-resources-video-create-params-members-changed
Breaking
medium confidence
  • VideoCreateParams imported from openai/resources, named in any type position
Patch, only when you name a model providerYour 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 released Published Updated

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

  • voice may be { id: string }. The member’s type adds ChatCompletionAudioParam.ID, an interface with a single id. 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.

ChangeSeverityDetectsFixVerified by
Changed the members of ChatCompletionAudioParam
openai-npm-6.29.0-resources-chat-completion-audio-param-members-changed
Breaking
medium confidence
  • ChatCompletionAudioParam imported from openai/resources, named in any type position
Patch, only when you name a model providerYour 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 released Published Updated

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

  • endpoint accepts '/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.

ChangeSeverityDetectsFixVerified by
Changed the members of BatchCreateParams
openai-npm-6.30.1-resources-batch-create-params-members-changed
Breaking
medium confidence
  • BatchCreateParams imported from openai/resources, named in any type position
Patch, only when you name a model providerYour 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 released Published Updated

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

  • type accepts '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”.
  • value is unchanged. It was already string | 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.

ChangeSeverityDetectsFixVerified by
Changed the members of ComparisonFilter
openai-npm-6.31.0-resources-comparison-filter-members-changed
Breaking
medium confidence
  • ComparisonFilter imported from openai/resources, named in any type position
Patch, only when you name a model providerYour 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 released Published Updated

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'. On ChatCompletionCreateParamsNonStreaming and ChatCompletionCreateParamsStreaming, the member was 'in-memory' | '24h' | null and 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_retention in resources/responses/responses.d.ts is 'in_memory' | '24h' | null in 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.

ChangeSeverityDetectsFixVerified by
Changed the members of ChatCompletionCreateParamsNonStreaming
openai-npm-6.35.0-resources-chat-completion-create-params-non-streaming-members-changed
Breaking
medium confidence
  • ChatCompletionCreateParamsNonStreaming imported from openai/resources, named in any type position
Patch, only when you name a model providerYour typecheck and tests
Changed the members of ChatCompletionCreateParamsStreaming
openai-npm-6.35.0-resources-chat-completion-create-params-streaming-members-changed
Breaking
medium confidence
  • ChatCompletionCreateParamsStreaming imported from openai/resources, named in any type position
Patch, only when you name a model providerYour 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 released Published Updated

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.apiKey accepts null. It was string | ApiKeySetter | undefined and is now string | ApiKeySetter | null | undefined.
  • ClientOptions.adminAPIKey is new. It is optional, typed string | null | undefined, and read from process.env['OPENAI_ADMIN_KEY'] when not given.
  • The client’s own fields follow. On the OpenAI class, apiKey was string and is now string | null, and a new adminAPIKey field is string | null. The feed’s rows cover ClientOptions, which openai and openai/client both 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.

ChangeSeverityDetectsFixVerified by
Changed the members of ClientOptions
openai-npm-6.36.0-client-options-members-changed
Breaking
medium confidence
  • ClientOptions imported from openai, named in any type position
Patch, only when you name a model providerYour typecheck and tests
Changed the members of ClientOptions
openai-npm-6.36.0-client-client-options-members-changed
Breaking
medium confidence
  • ClientOptions imported from openai/client, named in any type position
Patch, only when you name a model providerYour 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 released Published Updated

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

  • size accepts any string. On ImageGenerateParamsNonStreaming and ImageGenerateParamsStreaming, and on ImageEditParamsNonStreaming and ImageEditParamsStreaming, the member’s union gains (string & {}). Its documentation says gpt-image-2 and gpt-image-2-2026-04-21 take WIDTHxHEIGHT strings such as 1536x864, with both sides divisible by 16 and a maximum of 3840x2160.
  • ImageModel lists the new models. It gains 'gpt-image-2', 'gpt-image-2-2026-04-21' and 'chatgpt-image-latest'. The changelog also lists “fix imagegen size enum 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.

ChangeSeverityDetectsFixVerified by
Changed the members of ImageEditParamsNonStreaming
openai-npm-6.37.0-resources-image-edit-params-non-streaming-members-changed
Breaking
medium confidence
  • ImageEditParamsNonStreaming imported from openai/resources, named in any type position
Patch, only when you name a model providerYour typecheck and tests
Changed the members of ImageEditParamsStreaming
openai-npm-6.37.0-resources-image-edit-params-streaming-members-changed
Breaking
medium confidence
  • ImageEditParamsStreaming imported from openai/resources, named in any type position
Patch, only when you name a model providerYour typecheck and tests
Changed the members of ImageGenerateParamsNonStreaming
openai-npm-6.37.0-resources-image-generate-params-non-streaming-members-changed
Breaking
medium confidence
  • ImageGenerateParamsNonStreaming imported from openai/resources, named in any type position
Patch, only when you name a model providerYour typecheck and tests
Changed the members of ImageGenerateParamsStreaming
openai-npm-6.37.0-resources-image-generate-params-streaming-members-changed
Breaking
medium confidence
  • ImageGenerateParamsStreaming imported from openai/resources, named in any type position
Patch, only when you name a model providerYour 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 released Published Updated

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. On ChatCompletionCreateParamsNonStreaming and ChatCompletionCreateParamsStreaming, prompt_cache_key and safety_identifier were string and are now string | null. Both are still optional.
  • The Responses API types changed the same way. resources/responses/responses.d.ts declares both fields as string | null in 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.

ChangeSeverityDetectsFixVerified by
Changed the members of ChatCompletionCreateParamsNonStreaming
openai-npm-6.49.0-resources-chat-completion-create-params-non-streaming-members-changed
Breaking
medium confidence
  • ChatCompletionCreateParamsNonStreaming imported from openai/resources, named in any type position
Patch, only when you name a model providerYour typecheck and tests
Changed the members of ChatCompletionCreateParamsStreaming
openai-npm-6.49.0-resources-chat-completion-create-params-streaming-members-changed
Breaking
medium confidence
  • ChatCompletionCreateParamsStreaming imported from openai/resources, named in any type position
Patch, only when you name a model providerYour 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 scan

Then 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.

The OpenAI Node SDK migration guide lists every release page and says which to read for your upgrade.