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. 7.0.14: MockTranscriptionModelV4 gains a doStream member 1 breaking, 0 deprecations
  2. 7.0.40: Experimental_GeneratedImage is deprecated 0 breaking, 1 deprecation
  3. 7.0.50: ai drops the Experimental_ToolCallerReference export 2 breaking, 0 deprecations
  4. 7.0.63: Provider.rerankingModel becomes optional 1 breaking, 0 deprecations
  5. 7.0.76: ChatInit's messageMetadataSchema takes the message's metadata type 1 breaking, 0 deprecations
  6. 7.0.94: ai removes the seven experimental text batch exports 9 breaking, 0 deprecations
  7. 7.0.102: the experimental realtime session and model types reshaped 3 breaking, 0 deprecations
  8. 7.0.128: Experimental_EvaluationMockModelV4 deprecated in ai/test 0 breaking, 12 deprecations
  9. 7.0.129: reasoning type changed on CallSettings and LanguageModelCallOptions 2 breaking, 0 deprecations
  10. 7.0.143: supportedQuestionTypes changed on Experimental_EvaluationMockModelV4 and Experimental_DecisionMockModelV4 2 breaking, 0 deprecations

AI SDK 7.0.14: MockTranscriptionModelV4 gains a doStream member

ai 7.0.14 released Published Updated

ai@7.0.14 adds experimental streaming transcription, and the test mock for transcription models follows it. MockTranscriptionModelV4 in ai/test now declares a doStream member beside doGenerate. Only test code that names the mock as a type and builds a value of that type by hand is affected; code that constructs it with new keeps compiling.

What changed

  • MockTranscriptionModelV4 has a new doStream member. The class declares doStream: TranscriptionModelV4['doStream'], and its constructor options gain an optional doStream to set it. On TranscriptionModelV4 in @ai-sdk/provider@4.0.2 the method is optional, so the member may hold undefined, but an object literal annotated as the class must still name it.

Before and after

The affected type is imported from this module:

import type { MockTranscriptionModelV4 } from 'ai/test';

The class as ai@7.0.13 declared it:

declare class MockTranscriptionModelV4 implements TranscriptionModelV4 {
readonly specificationVersion = "v4";
readonly provider: TranscriptionModelV4['provider'];
readonly modelId: TranscriptionModelV4['modelId'];
doGenerate: TranscriptionModelV4['doGenerate'];
constructor({ provider, modelId, doGenerate, }?: { ... });
}

And as ai@7.0.14 declares it:

declare class MockTranscriptionModelV4 implements TranscriptionModelV4 {
readonly specificationVersion = "v4";
readonly provider: TranscriptionModelV4['provider'];
readonly modelId: TranscriptionModelV4['modelId'];
doGenerate: TranscriptionModelV4['doGenerate'];
doStream: TranscriptionModelV4['doStream'];
constructor({ provider, modelId, doGenerate, doStream, }?: { ... });
}

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 the finding is reported with its 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 7.0.14 and withholds patches that fail. Read the patch header to see which checks passed.

Where a hand-built object is typed as the mock, add doStream to it, or build the mock with new MockTranscriptionModelV4({ ... }) and let the constructor supply the member. Tests that already use the constructor need nothing.

The scan reports the name in a type position when it is imported from ai/test. A new expression with no annotation is not a finding, and neither is the name reached through a re-export of your own. A clean scan says no file names this type from ai/test, and nothing more about the release.

What Emendant detects, fixes and verifies

1 change in ai 7.0.14. 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 MockTranscriptionModelV4
ai-npm-7.0.14-test-mock-transcription-model-v4-members-changed
Breaking
medium confidence
  • MockTranscriptionModelV4 imported from ai/test, 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/ai/7.0.14.json, snapshot 2026-09-23.1.

Primary sources

AI SDK 7.0.40: Experimental_GeneratedImage is deprecated

ai 7.0.40 released Published Updated

ai@7.0.40 marks the Experimental_GeneratedImage named export as deprecated. Nothing about the type changed: it is still an alias for GeneratedFile, and the package’s own declaration file now carries a @deprecated tag saying the alias will be removed in v8. A repository importing Experimental_GeneratedImage from ai keeps compiling, and now sees a deprecation warning from its editor and typechecker. Anybody who adopted the image generation API while it still carried the Experimental_ prefix is affected; nobody using GeneratedFile directly is.

What changed

  • Experimental_GeneratedImage is deprecated, not removed. ai@7.0.39 exported it as GeneratedFile as Experimental_GeneratedImage, an unmarked alias. ai@7.0.40 gives the alias its own declared type and tags it: “Use GeneratedFile instead. This alias will be removed in v8.” Nothing changes at runtime, and existing code still typechecks.

Before and after

The import Emendant detects:

import { Experimental_GeneratedImage } from 'ai';
export { Experimental_GeneratedImage };

Name a model provider and emendant fix writes the rename the deprecation notice asks for. It is a plain identifier swap, since Experimental_GeneratedImage and GeneratedFile describe the same shape:

import { GeneratedFile } from 'ai';
export { GeneratedFile };

Migration guidance and its limits

Emendant reports every import of Experimental_GeneratedImage from ai, at high confidence, and offers a patch once you name a model provider on the command line or in emendant.json. Review the assisted patch before applying it. Emendant checks each patch in a copy of your repository at 7.0.40 and withholds patches that fail. Read the patch header to see which checks passed. Without a provider the finding is reported with its guidance and nothing is sent anywhere.

GeneratedFile is the documented replacement and has the same type. Review the import rename, then run your typecheck.

There is no removal date beyond “v8”, and v8 is not out. Leaving Experimental_GeneratedImage in place for now still compiles; the finding exists so the rename happens on your schedule rather than at the next major version.

The scan detects a direct import { Experimental_GeneratedImage } from 'ai'. A namespace import, a re-export under another local name from a wrapper module, or a value reached through something other than a static import from ai is not attributed, and a clean scan says only that this file holds no such import, not that the package holds no other deprecated name. This is the only change ai@7.0.40 makes that Emendant’s feed describes; the release may carry other edits the feed does not cover.

What Emendant detects, fixes and verifies

1 change in ai 7.0.40. 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
Deprecated Experimental_GeneratedImage
ai-npm-7.0.40-experimental-generated-image-deprecated
Deprecation
  • Experimental_GeneratedImage imported from ai
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.1.0 or later. Feed entry feed/npm/ai/7.0.40.json, snapshot 2026-09-20.1.

Primary sources

AI SDK 7.0.50: ai drops the Experimental_ToolCallerReference export

ai 7.0.50 released Published Updated

ai@7.0.50 is a patch release, and two changes in it can break a typecheck. Experimental_ToolCallerReference is no longer exported from ai, which the package’s own changelog files under “simplify tool caller configuration.” And the async video API the release adds reshapes the MockVideoModelV4 test class. Code that imports Experimental_ToolCallerReference by name, or names MockVideoModelV4 as a type, is affected.

What changed

  • Experimental_ToolCallerReference is gone. The interface that described a tool caller reference, { readonly toolName: NAME }, is no longer exported by ai. The related Experimental_ToolCallers type is still exported, but its callers are no longer built from this interface: it now expects a plain tool-name string, or the literal 'AI_SDK_DIRECT_TOOL_CALL', in place of a reference object.
  • MockVideoModelV4 follows the new async video interface. The class in ai/test now declares handleWebhookOption, doStart and doStatus beside doGenerate, and its constructor options accept all three. The changelog says video models may now implement doStart, doStatus and handleWebhookOption instead of, or in addition to, doGenerate, and on the Experimental_VideoModelV4 type in @ai-sdk/provider@4.0.5 the mock’s doGenerate may now be undefined. An object literal annotated as the mock must name the three new members.

Before and after

The scan identifies this imported name:

import { Experimental_ToolCallerReference } from 'ai';
export { Experimental_ToolCallerReference };

The migration changes how caller entries are built. Compare the two declarations before updating your code. In ai@7.0.49, a caller entry came from this interface:

export type Experimental_ToolCallers<TOOLS extends ToolSet> = (callers: {
[NAME in ToolCallerName<TOOLS>]: Experimental_ToolCallerReference<NAME>;
}) => {
[NAME in keyof TOOLS]?: ReadonlyArray<'direct' | ToolCallerReferenceUnion<TOOLS>>;
};

In ai@7.0.50, the same type takes plain strings:

export type Experimental_ToolCallers<TOOLS extends ToolSet> = {
[NAME in keyof TOOLS]?: ReadonlyArray<
'AI_SDK_DIRECT_TOOL_CALL' | ToolCallerName<TOOLS>
>;
};

A caller used to be an object the removed interface typed; now it is the tool’s own name, or the direct-call literal.

Migration guidance and its limits

The Experimental_ToolCallerReference finding carries an assisted fix. Name a model provider on the command line or in emendant.json and emendant fix will try the rewrite; without one the finding is reported with its guidance and nothing is sent anywhere. Caller entries now use strings, so review how your code builds them. This requires more than an import rename. Emendant checks each patch in a copy of your repository at 7.0.50 and withholds patches that fail. Read the patch header to see which checks passed.

Drop the import once you see it. If your own code built caller reference objects ({ toolName: name }) to satisfy the old Experimental_ToolCallers callback, replace each one with the plain tool-name string the type now expects, following the shape above.

The scan detects the named import. Code that already wrote caller entries as strings, or that reached Experimental_ToolCallerReference through a re-export rather than importing it from ai directly, is outside what this entry detects. The async generateVideo polling and webhook APIs themselves are not covered; only their effect on MockVideoModelV4 is. A clean scan says a file does not import this one name from ai, and nothing about the rest of the release.

The Experimental_ToolCallerReference finding is high confidence and breaking: if it fires, the import really is gone in 7.0.50.

The MockVideoModelV4 finding is medium confidence and also carries an assisted fix. Review whether the changed members affect your code before applying a patch. Where a hand-built object is typed as the mock, add the three new members or build it with new MockVideoModelV4({ ... }), whose options take all three. A mock constructed that way, with no annotation, is not a finding.

What Emendant detects, fixes and verifies

2 changes in ai 7.0.50. 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
Removed Experimental_ToolCallerReference
ai-npm-7.0.50-experimental-tool-caller-reference-removed
error TS2724: '"ai"' has no exported member named 'Experimental_ToolCallerReference'. Did you mean 'experimental_toolCaller'?
Breaking
  • Experimental_ToolCallerReference imported from ai
Patch, only when you name a model providerYour typecheck and tests
Changed the members of MockVideoModelV4
ai-npm-7.0.50-test-mock-video-model-v4-members-changed
Breaking
medium confidence
  • MockVideoModelV4 imported from ai/test, 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.

The error TS lines are what TypeScript 5.9.3 printed when code that compiled against ai 7.0.49 was compiled against 7.0.50. A row without one is a change the compiler does not report, such as a deprecation or a change in behaviour.

Requires emendant@0.3.0 or later. Feed entry feed/npm/ai/7.0.50.json, snapshot 2026-09-23.4.

Primary sources

AI SDK 7.0.63: Provider.rerankingModel becomes optional

ai 7.0.63 released Published Updated

ai@7.0.63 makes rerankingModel an optional method on the Provider type. The package’s changelog gives the reason: providers without reranking model support can now be assigned to Provider. Code that builds a Provider is unaffected; code that holds a value typed Provider and calls rerankingModel on it now has to handle the method being absent.

What changed

  • rerankingModel is optional on Provider. In 7.0.62 it was declared rerankingModel(modelId: string): RerankingModel. In 7.0.63 it is rerankingModel?(modelId: string): RerankingModel. Under strict, a call such as provider.rerankingModel('id') on a Provider is now a “possibly undefined” error.

Before and after

The affected type is imported from this module:

import type { Provider } from 'ai';

The member as ai@7.0.62 declared it:

rerankingModel(modelId: string): RerankingModel;

And as ai@7.0.63 declares it:

rerankingModel?(modelId: string): RerankingModel;

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. Emendant checks each patch in a copy of your repository at 7.0.63 and withholds patches that fail. Read the patch header to see which checks passed.

Where your code calls rerankingModel through a Provider, guard the call (provider.rerankingModel?.(id)) and decide what happens when a provider has no reranking model. A non-null assertion compiles, but it moves the failure from the type checker to a runtime TypeError for the providers this release now admits.

The scan reports the name in a type position when it is imported from ai. A call on a value whose type is inferred, with Provider never written, is not a finding, and neither is a call through a provider-specific type. A clean scan says no file names Provider from ai, and nothing more about the release.

What Emendant detects, fixes and verifies

1 change in ai 7.0.63. 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 Provider
ai-npm-7.0.63-provider-members-changed
Breaking
medium confidence
  • Provider imported from ai, 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/ai/7.0.63.json, snapshot 2026-09-23.4.

Primary sources

AI SDK 7.0.76: ChatInit's messageMetadataSchema takes the message's metadata type

ai 7.0.76 released Published Updated

ai@7.0.76 changes how ChatInit types its messageMetadataSchema option. It used to infer the metadata type from the message type through a conditional type; it now reads it straight off the message’s metadata property. The package’s changelog says why: nullish metadata schemas are now allowed for UI messages with branded IDs. Code that passes a schema keeps compiling in the common case; code that reads the option’s type back is what can notice.

What changed

  • messageMetadataSchema is typed from UI_MESSAGE['metadata']. In 7.0.74 the option was FlexibleSchema<InferUIMessageMetadata<UI_MESSAGE>>, where InferUIMessageMetadata matches the message against UIMessage<infer METADATA>. In 7.0.76 it is FlexibleSchema<UI_MESSAGE['metadata']>. Because metadata is an optional property on UIMessage, the new type includes undefined, and it no longer depends on the message type matching UIMessage through inference.

Before and after

The affected type is imported from this module:

import type { ChatInit } from 'ai';

The option as ai@7.0.74 declared it:

messageMetadataSchema?: FlexibleSchema<InferUIMessageMetadata<UI_MESSAGE>>;

And as ai@7.0.76 declares it:

messageMetadataSchema?: FlexibleSchema<UI_MESSAGE['metadata']>;

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. Most ChatInit sites only pass options in, and those may need no edit. Emendant checks each patch in a copy of your repository at 7.0.76 and withholds patches that fail. Read the patch header to see which checks passed.

Check code that takes messageMetadataSchema out of a ChatInit and hands it to something typed against the metadata type alone: the value’s type now admits undefined metadata. If you declared message types with branded IDs and worked around the old inference, the workaround may no longer be needed.

The scan reports the name in a type position when it is imported from ai. Options passed straight to new Chat(...) or to a framework hook, with ChatInit never written, are not findings. The other change in 7.0.76, duplicate part ids, is a runtime fix this entry does not cover. A clean scan says no file names ChatInit from ai, and nothing more about the release.

What Emendant detects, fixes and verifies

1 change in ai 7.0.76. 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 ChatInit
ai-npm-7.0.76-chat-init-members-changed
Breaking
medium confidence
  • ChatInit imported from ai, 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/ai/7.0.76.json, snapshot 2026-09-23.4.

Primary sources

AI SDK 7.0.94: ai removes the seven experimental text batch exports

ai 7.0.94 released Published Updated

ai@7.0.94 is a patch release that reshapes the experimental batch API. Seven names leave the package and nine arrive in their place: a batch is no longer text-specific, and the model it runs against is now named per request rather than once for the whole batch. The package’s changelog files the work under “feat: support per-request models in batch.” Only code that imports one of the seven removed names from ai is affected.

What changed

  • experimental_startTextBatch is now experimental_startBatch, and it takes a provider rather than a model. Experimental_StartTextBatchOptions and Experimental_StartTextBatchResult go with it, replaced by Experimental_StartBatchOptions and Experimental_StartBatchResult. The new options carry an optional provider, which defaults to the global provider or to the Vercel AI Gateway, in place of the required model.
  • The batch-level model, tools, toolChoice, toolOrder and toolsContext move onto each request. A request is now discriminated by modality: Experimental_TextBatchRequest keeps its name but requires type: 'text' and its own model, and Experimental_BatchRequest is the union over modalities.
  • Experimental_TextBatch and Experimental_TextBatchReference are gone. Experimental_Batch and Experimental_BatchReference replace them. The reference is a new shape as well as a new name: version is 2, and the type and modelId fields are no longer part of it, since a batch can hold requests against more than one model.
  • Experimental_BatchOperationOptions splits in two. experimental_getBatchStatus and experimental_getBatchResults keep their names, but now take Experimental_GetBatchStatusOptions and Experimental_GetBatchResultsOptions, each naming a provider instead of a model.
  • Experimental_BatchLanguageModel is gone. Nothing replaces the type directly. A model is a plain model id string on a request, and the provider is typed by Experimental_BatchProvider.

Before and after

The scan identifies imports of the removed names:

import { experimental_startTextBatch } from 'ai';
export { experimental_startTextBatch };

The seven removals support assisted fixes. Compare how the model and tools are supplied before updating the batch calls. In ai@7.0.93, the model and the tools belonged to the batch:

type StartTextBatchOptions<TOOLS extends ToolSet = ToolSet> = {
model: BatchLanguageModel;
requests: ReadonlyArray<TextBatchRequest>;
tools?: TOOLS;
toolChoice?: ToolChoice<NoInfer<TOOLS>>;
providerOptions?: ProviderOptions;
webhookUrl?: string;
} & BatchRequestOptions;

In ai@7.0.94, the batch names a provider and each request names its own model:

type StartBatchOptions<TOOLS extends ToolSet = ToolSet, PROVIDER extends BatchProvider = BatchProvider> = {
provider?: PROVIDER;
requests: ReadonlyArray<BatchRequest<InferBatchModelIds<PROVIDER>, TOOLS>>;
providerOptions?: ProviderOptions;
webhookUrl?: string;
} & BatchCallOptions;

Migration guidance and its limits

The seven removed names carry an assisted fix. Name a model provider on the command line or in emendant.json and emendant fix tries each one; without one they are reported with their guidance and nothing is sent anywhere. Some removals require developer changes because they have no direct replacement. Experimental_BatchLanguageModel has no direct successor at all, and experimental_startTextBatch becomes a differently shaped call rather than a differently spelled one. Emendant checks each patch in a copy of your repository at 7.0.94 and withholds patches that fail. Read the patch header to see which checks passed.

The two findings on experimental_getBatchStatus and experimental_getBatchResults are report only. Both fire at the options literal rather than at an import, because the model key those calls took is the thing that went, and what belongs there instead is a provider on a differently named type rather than a key to rename.

Rename the call and the two option types, then move what the batch used to hold down onto the requests. Each entry in requests takes type: 'text' and a model, plus the tools, toolChoice, toolOrder and toolsContext that used to sit beside requests. Drop Experimental_BatchLanguageModel from your own signatures and use the model id string the request expects.

Persisted references do not survive the upgrade. A batch reference stored by ai@7.0.93 is version 1 and carries type and modelId; the code reading it in 7.0.94 expects version 2 and neither field. A batch started before the upgrade has to be drained before it, or its reference migrated by hand.

The scan detects the named imports. Two things a scan therefore stays quiet about: Experimental_BatchReference and Experimental_TextBatchRequest kept their names while changing shape, so importing either is not a finding even though the code around it may no longer compile. A clean scan says a file does not import these seven names from ai, and nothing more about the release.

What Emendant detects, fixes and verifies

9 changes in ai 7.0.94. 0 automatic fixes, 7 fixes requiring a model provider you choose, 2 report only. Each patch states which checks passed. Understand patch evidence.

ChangeSeverityDetectsFixVerified by
Removed Experimental_BatchLanguageModel
ai-npm-7.0.94-experimental-batch-language-model-removed
error TS2305: Module '"ai"' has no exported member 'Experimental_BatchLanguageModel'.
Breaking
  • Experimental_BatchLanguageModel imported from ai
Patch, only when you name a model providerYour typecheck and tests
Removed Experimental_BatchOperationOptions
ai-npm-7.0.94-experimental-batch-operation-options-removed
error TS2305: Module '"ai"' has no exported member 'Experimental_BatchOperationOptions'.
Breaking
  • Experimental_BatchOperationOptions imported from ai
Patch, only when you name a model providerYour typecheck and tests
Removed Experimental_StartTextBatchOptions
ai-npm-7.0.94-experimental-start-text-batch-options-removed
error TS2724: '"ai"' has no exported member named 'Experimental_StartTextBatchOptions'. Did you mean 'Experimental_StartBatchOptions'?
Breaking
  • Experimental_StartTextBatchOptions imported from ai
Patch, only when you name a model providerYour typecheck and tests
Removed Experimental_StartTextBatchResult
ai-npm-7.0.94-experimental-start-text-batch-result-removed
error TS2724: '"ai"' has no exported member named 'Experimental_StartTextBatchResult'. Did you mean 'Experimental_StartBatchResult'?
Breaking
  • Experimental_StartTextBatchResult imported from ai
Patch, only when you name a model providerYour typecheck and tests
Removed Experimental_TextBatch
ai-npm-7.0.94-experimental-text-batch-removed
error TS2724: '"ai"' has no exported member named 'Experimental_TextBatch'. Did you mean 'Experimental_Batch'?
Breaking
  • Experimental_TextBatch imported from ai
Patch, only when you name a model providerYour typecheck and tests
Removed Experimental_TextBatchReference
ai-npm-7.0.94-experimental-text-batch-reference-removed
error TS2724: '"ai"' has no exported member named 'Experimental_TextBatchReference'. Did you mean 'Experimental_BatchReference'?
Breaking
  • Experimental_TextBatchReference imported from ai
Patch, only when you name a model providerYour typecheck and tests
Removed experimental_startTextBatch
ai-npm-7.0.94-experimental-start-text-batch-removed
error TS2724: '"ai"' has no exported member named 'experimental_startTextBatch'. Did you mean 'experimental_startBatch'?
Breaking
  • experimental_startTextBatch imported from ai
Patch, only when you name a model providerYour typecheck and tests
Removed model from the first argument of experimental_getBatchResults()
ai-npm-7.0.94-experimental-get-batch-results-argument-1-model-removed
error TS2353: Object literal may only specify known properties, and 'model' does not exist in type 'GetBatchResultsOptions<ToolSet>'.
Breaking
  • the model key in the object passed to experimental_getBatchResults imported from ai
Report onlyNot applicable
Removed model from the first argument of experimental_getBatchStatus()
ai-npm-7.0.94-experimental-get-batch-status-argument-1-model-removed
error TS2353: Object literal may only specify known properties, and 'model' does not exist in type 'GetBatchStatusOptions'.
Breaking
  • the model key in the object passed to experimental_getBatchStatus imported from ai
Report onlyNot applicable

emendant explain <change-id> prints any row's entry, guidance and sources at the terminal.

The error TS lines are what TypeScript 5.9.3 printed when code that compiled against ai 7.0.93 was compiled against 7.0.94. A row without one is a change the compiler does not report, such as a deprecation or a change in behaviour.

Requires emendant@0.1.4 or later. Feed entry feed/npm/ai/7.0.94.json, snapshot 2026-09-20.1.

Primary sources

AI SDK 7.0.102: the experimental realtime session and model types reshaped

ai 7.0.102 released Published Updated

ai@7.0.102 rebuilds the experimental realtime runtime: browser-direct WebRTC, an OpenAI Live path, and a new session lifecycle with graceful close. Three exported types change shape under the same names. Code that subclasses Experimental_AbstractRealtimeSession, calls a realtime model’s connection methods directly, or reads a session’s api option is what to check. The API is experimental, and the package’s changelog records removals in the same release.

What changed

  • Experimental_AbstractRealtimeSession gains methods and changes return types. sendEvent now returns Promise<void> rather than void. connect gains an overload taking { stream?, capture? }. sendAudio’s parameter is renamed from base64Audio to audio. New public methods arrive: close(options?), resumeAudioCapture() and resumePlayback(), each returning a promise. A subclass that overrides sendEvent returning void, or declares its own close with another signature, no longer type checks.
  • Two Experimental_RealtimeModel methods become optional. On the v4 realtime model in @ai-sdk/provider@4.0.15, doCreateClientSecret and getWebSocketConfig are now optional, beside new optional capabilities, createServerEventParser, doCreateWebRTCSession, getServerWebSocketConfig and getWebRTCConfig. Calling either of the two directly on a model typed this way needs a guard.
  • Experimental_RealtimeSessionOptions.api is a union. It was { token: string }. It is now one of a token, a session endpoint for the WebRTC SDP exchange, or a websocket URL with optional protocols. Passing { token } still works; reading options.api.token now yields string | undefined. Four optional timing settings arrive beside it: startupTimeoutMs, closeTimeoutMs, rtcDisconnectTimeoutMs and maxPlaybackBufferSeconds.

Before and after

The affected type is imported from this module:

import type { Experimental_AbstractRealtimeSession } from 'ai';

Two lines of the class as ai@7.0.101 declared it:

sendEvent(event: RealtimeClientEvent): void;
sendAudio(base64Audio: string): void;

And as ai@7.0.102 declares them, with one of the new methods:

sendEvent(event: RealtimeClientEvent): Promise<void>;
sendAudio(audio: string): void;
close(options?: {
eventId?: string;
}): Promise<void>;

Migration guidance and its limits

All three 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 7.0.102 and withholds patches that fail. Read the patch header to see which checks passed.

In a subclass, make an overridden sendEvent return a promise, and rename or align any close, resumeAudioCapture or resumePlayback of your own. Where you call sendEvent, await it or handle its rejection. Where you call doCreateClientSecret or getWebSocketConfig on a model, check the method exists first.

The type changes are only part of this release. The changelog also records behaviour removed from the runtime, among them the autoContinueTools option and, on continuous sessions, sendTextMessage and addToolOutput, which now reject. None of that is in these entries. The scan reports the three names in a type position when they are imported from ai; a session created and used with its type inferred is not a finding. A clean scan does not prove a realtime integration works on 7.0.102.

What Emendant detects, fixes and verifies

3 changes in ai 7.0.102. 0 automatic fixes, 3 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 Experimental_AbstractRealtimeSession
ai-npm-7.0.102-experimental-abstract-realtime-session-members-changed
Breaking
medium confidence
  • Experimental_AbstractRealtimeSession imported from ai, named in any type position
Patch, only when you name a model providerYour typecheck and tests
Changed the members of Experimental_RealtimeModel
ai-npm-7.0.102-experimental-realtime-model-members-changed
Breaking
medium confidence
  • Experimental_RealtimeModel imported from ai, named in any type position
Patch, only when you name a model providerYour typecheck and tests
Changed the members of Experimental_RealtimeSessionOptions
ai-npm-7.0.102-experimental-realtime-session-options-members-changed
Breaking
medium confidence
  • Experimental_RealtimeSessionOptions imported from ai, 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/ai/7.0.102.json, snapshot 2026-09-23.4.

Primary sources

AI SDK 7.0.128: Experimental_EvaluationMockModelV4 deprecated in ai/test

ai 7.0.128 released Published Updated

ai@7.0.128 marks Experimental_EvaluationMockModelV4, exported from ai/test, as deprecated. The replacement is Experimental_DecisionMockModelV4. Nothing is removed and the old name behaves as before. Test code that imports the old name from ai/test is affected, and will show a deprecation warning in editors and linters.

What changed

  • Experimental_EvaluationMockModelV4 is deprecated. Both the value and the type of that name now carry a @deprecated tag pointing at Experimental_DecisionMockModelV4. In ai@7.0.127 the same name was a plain export of the mock model class. In ai@7.0.128 it is an alias of Experimental_DecisionMockModelV4, so the two names refer to the same thing.
  • The rest of the evaluation API is deprecated too, with the same promise. Imported from ai, each old name is an alias of a Decision name and the old name still works. The mapping is experimental_evaluate to experimental_decide, Experimental_EvaluateStartEvent to Experimental_DecideStartEvent, Experimental_EvaluateEndEvent to Experimental_DecideEndEvent, and Experimental_EvaluationModel, Experimental_EvaluationQuestion, Experimental_EvaluationAnswer, Experimental_EvaluationResult, Experimental_EvaluationProviderRegistry, Experimental_EvaluationModelCallStartEvent, Experimental_EvaluationModelCallEndEvent and Experimental_EvaluationUnsupportedQuestionTypeError each to the same name with Decision in place of Evaluation.

Before and after

Code that imports the deprecated name:

import { Experimental_EvaluationMockModelV4 } from 'ai/test';
export { Experimental_EvaluationMockModelV4 };

Moved to the replacement:

import { Experimental_DecisionMockModelV4 } from 'ai/test';
export { Experimental_DecisionMockModelV4 };

If you import the name under an alias, keep the alias and change only the imported name.

Migration guidance and its limits

The one finding in this release has an assisted fix, and it needs a named model provider. Name one on the command line or in emendant.json and emendant fix tries it. Without one, the finding is reported with its guidance and nothing is sent anywhere. Emendant checks the patch with your typecheck and tests where your project has them, and withholds a patch that fails. The patch header shows which checks ran.

The replacement matches the old behaviour, so the edit renames the import and every use of it. A patch should not change what your test code does. Where a site cannot be moved over with confidence, the finding stays open for you to review.

The scan reports named imports of Experimental_EvaluationMockModelV4 from ai/test and of the other deprecated names above from ai. An import of the same name from another module, or an alias of Experimental_DecisionMockModelV4, is not a finding. A clean scan covers this deprecation only and does not show the rest of your upgrade is complete.

What Emendant detects, fixes and verifies

12 changes in ai 7.0.128. 0 automatic fixes, 12 fixes requiring a model provider you choose, 0 report only. Each patch states which checks passed. Understand patch evidence.

ChangeSeverityDetectsFixVerified by
Deprecated Experimental_EvaluationMockModelV4
ai-npm-7.0.128-test-experimental-evaluation-mock-model-v4-deprecated
Deprecation
  • Experimental_EvaluationMockModelV4 imported from ai/test
Patch, only when you name a model providerYour typecheck and tests
Deprecated Experimental_EvaluateEndEvent
ai-npm-7.0.128-experimental-evaluate-end-event-deprecated
Deprecation
  • Experimental_EvaluateEndEvent imported from ai
Patch, only when you name a model providerYour typecheck and tests
Deprecated Experimental_EvaluateStartEvent
ai-npm-7.0.128-experimental-evaluate-start-event-deprecated
Deprecation
  • Experimental_EvaluateStartEvent imported from ai
Patch, only when you name a model providerYour typecheck and tests
Deprecated Experimental_EvaluationAnswer
ai-npm-7.0.128-experimental-evaluation-answer-deprecated
Deprecation
  • Experimental_EvaluationAnswer imported from ai
Patch, only when you name a model providerYour typecheck and tests
Deprecated Experimental_EvaluationModel
ai-npm-7.0.128-experimental-evaluation-model-deprecated
Deprecation
  • Experimental_EvaluationModel imported from ai
Patch, only when you name a model providerYour typecheck and tests
Deprecated Experimental_EvaluationModelCallEndEvent
ai-npm-7.0.128-experimental-evaluation-model-call-end-event-deprecated
Deprecation
  • Experimental_EvaluationModelCallEndEvent imported from ai
Patch, only when you name a model providerYour typecheck and tests
Deprecated Experimental_EvaluationModelCallStartEvent
ai-npm-7.0.128-experimental-evaluation-model-call-start-event-deprecated
Deprecation
  • Experimental_EvaluationModelCallStartEvent imported from ai
Patch, only when you name a model providerYour typecheck and tests
Deprecated Experimental_EvaluationProviderRegistry
ai-npm-7.0.128-experimental-evaluation-provider-registry-deprecated
Deprecation
  • Experimental_EvaluationProviderRegistry imported from ai
Patch, only when you name a model providerYour typecheck and tests
Deprecated Experimental_EvaluationQuestion
ai-npm-7.0.128-experimental-evaluation-question-deprecated
Deprecation
  • Experimental_EvaluationQuestion imported from ai
Patch, only when you name a model providerYour typecheck and tests
Deprecated Experimental_EvaluationResult
ai-npm-7.0.128-experimental-evaluation-result-deprecated
Deprecation
  • Experimental_EvaluationResult imported from ai
Patch, only when you name a model providerYour typecheck and tests
Deprecated Experimental_EvaluationUnsupportedQuestionTypeError
ai-npm-7.0.128-experimental-evaluation-unsupported-question-type-error-deprecated
Deprecation
  • Experimental_EvaluationUnsupportedQuestionTypeError imported from ai
Patch, only when you name a model providerYour typecheck and tests
Deprecated experimental_evaluate
ai-npm-7.0.128-experimental-evaluate-deprecated
Deprecation
  • experimental_evaluate imported from ai
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.1.0 or later. Feed entry feed/npm/ai/7.0.128.json, snapshot 2026-10-08.2.

Primary sources

ai@7.0.129: reasoning type changed on CallSettings and LanguageModelCallOptions

ai 7.0.129 released Published

ai@7.0.129 declares the reasoning member of LanguageModelCallOptions with a different type, and CallSettings carries the same change. The changelog attributes it to a new portable max reasoning level. Code that names either type and supplies or reads reasoning is affected, most of all exhaustive switches and mappings keyed on ReasoningLevel.

What changed

  • LanguageModelCallOptions declares reasoning differently. The changelog says adding max widens the reasoning option and the derived ReasoningLevel type. Ordinary calls that use the existing reasoning levels are still accepted.
  • CallSettings follows. In the declarations it is a deprecated alias of LanguageModelCallOptions combined with RequestOptions, minus timeout, so the same member change reaches it. Both findings are breaking, and the scan reports any import of either type from ai that is named in a type position.

Before and after

There is no deterministic rewrite for this release, so there is no single before and after to copy. The scan finds sites that name either type, such as this import:

import type { CallSettings } from 'ai';

The declaration in ai@7.0.129 shows why a site that names only CallSettings is still reached by the reasoning change:

/** @deprecated Use `LanguageModelCallOptions` combined with `RequestOptions` instead. */
export type CallSettings = LanguageModelCallOptions & Omit<RequestOptions, 'timeout'>;

Naming the type does not by itself mean a changed member reaches your code. Only a site that supplies or reads reasoning needs an edit, and the edit brings that site into line with what the release declares.

Migration guidance and its limits

Run emendant scan to list every site that names CallSettings or LanguageModelCallOptions. Both findings have assisted fixes, and those need a named model provider. Name one on the command line and emendant fix tries each site. Without one, the finding is reported with its guidance and nothing is patched.

Emendant runs your typecheck and tests against a patch where your project has them, and a patch that fails is withheld. A site that only builds or forwards options may need no edit. Where a site cannot be brought into line with what the release declares, the finding stays open for you to review.

No finding in this release is report only, and none has a deterministic patch. Check by hand any exhaustive switch over reasoning levels, and any mapping keyed on ReasoningLevel, so that each handles max.

A clean scan covers these two named type imports only. It does not look at the provider request mappings the changelog describes for Amazon Bedrock and Fireworks, and it does not show the rest of your upgrade is complete.

What Emendant detects, fixes and verifies

2 changes in ai 7.0.129. 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 CallSettings
ai-npm-7.0.129-call-settings-members-changed
Breaking
medium confidence
  • CallSettings imported from ai, named in any type position
Patch, only when you name a model providerYour typecheck and tests
Changed the members of LanguageModelCallOptions
ai-npm-7.0.129-language-model-call-options-members-changed
Breaking
medium confidence
  • LanguageModelCallOptions imported from ai, 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/ai/7.0.129.json, snapshot 2026-10-12.1.

Primary sources

ai@7.0.143: supportedQuestionTypes changed on Experimental_EvaluationMockModelV4 and Experimental_DecisionMockModelV4

ai 7.0.143 released Published

ai@7.0.143 declares supportedQuestionTypes with a different type on the two decision mock models exported from ai/test, Experimental_EvaluationMockModelV4 and Experimental_DecisionMockModelV4. Test code that names either type is affected, most of all code that supplies or reads supportedQuestionTypes. The changelog for this release adds a box decision question type.

What changed

  • Experimental_DecisionMockModelV4 declares supportedQuestionTypes differently. The member is typed by reference to the decision model interface from @ai-sdk/provider, which this release moves to 4.0.29 alongside the new box question type. The scan reports any import of this type from ai/test that is named in a type position.
  • Experimental_EvaluationMockModelV4 follows. It is a deprecated alias of Experimental_DecisionMockModelV4, so the same member change reaches it. It is a separate finding and is reported on its own imports from ai/test.

Both findings are breaking. Naming either type does not by itself mean the changed member reaches your code, so only a site that supplies or reads supportedQuestionTypes needs an edit.

Before and after

Neither finding has a deterministic rewrite, so there is no before and after to copy. The scan finds sites that import either type from ai/test, such as this one:

import type { Experimental_DecisionMockModelV4 } from 'ai/test';

The member in question is declared on the mock model like this:

readonly supportedQuestionTypes: Experimental_DecisionModelV4['supportedQuestionTypes'];

The declaration text is the same in 7.0.142 and 7.0.143. What changed is the type it resolves to, so an edit has to follow what the release declares for that member and nothing else in the file.

Migration guidance and its limits

Run emendant scan to list every site that names either type. Both findings have assisted fixes, and those need a named model provider. Name one on the command line and emendant fix tries each site. Without one, the finding is reported with its guidance and nothing is patched.

Emendant runs your typecheck and tests against a patch where your project has them, and withholds a patch that fails. A site that only passes a mock along, or never touches supportedQuestionTypes, may need no edit. Where a site cannot be brought into line with what the release declares, the finding stays open for you to review.

No finding in this release is report only, and none has a deterministic patch. If your mocks list supported question types, check by hand that they still match the types the release declares, including the new box type if your tests exercise it.

The scan does not report an import of the same name from another module, so a local compatibility shim is not a finding. A clean scan covers these two type imports only. It does not show that the rest of your upgrade is complete.

What Emendant detects, fixes and verifies

2 changes in ai 7.0.143. 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 Experimental_EvaluationMockModelV4
ai-npm-7.0.143-test-experimental-evaluation-mock-model-v4-members-changed
Breaking
medium confidence
  • Experimental_EvaluationMockModelV4 imported from ai/test, named in any type position
Patch, only when you name a model providerYour typecheck and tests
Changed the members of Experimental_DecisionMockModelV4
ai-npm-7.0.143-test-experimental-decision-mock-model-v4-members-changed
Breaking
medium confidence
  • Experimental_DecisionMockModelV4 imported from ai/test, 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/ai/7.0.143.json, snapshot 2026-10-17.2.

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 AI SDK migration guide lists every release page and says which to read for your upgrade.