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.
- 7.0.14: MockTranscriptionModelV4 gains a doStream member 1 breaking, 0 deprecations
- 7.0.40: Experimental_GeneratedImage is deprecated 0 breaking, 1 deprecation
- 7.0.50: ai drops the Experimental_ToolCallerReference export 2 breaking, 0 deprecations
- 7.0.63: Provider.rerankingModel becomes optional 1 breaking, 0 deprecations
- 7.0.76: ChatInit's messageMetadataSchema takes the message's metadata type 1 breaking, 0 deprecations
- 7.0.94: ai removes the seven experimental text batch exports 9 breaking, 0 deprecations
- 7.0.102: the experimental realtime session and model types reshaped 3 breaking, 0 deprecations
- 7.0.128: Experimental_EvaluationMockModelV4 deprecated in ai/test 0 breaking, 12 deprecations
- 7.0.129: reasoning type changed on CallSettings and LanguageModelCallOptions 2 breaking, 0 deprecations
- 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 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
MockTranscriptionModelV4has a newdoStreammember. The class declaresdoStream: TranscriptionModelV4['doStream'], and its constructor options gain an optionaldoStreamto set it. OnTranscriptionModelV4in@ai-sdk/provider@4.0.2the method is optional, so the member may holdundefined, 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.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of MockTranscriptionModelV4ai-npm-7.0.14-test-mock-transcription-model-v4-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/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 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_GeneratedImageis deprecated, not removed. ai@7.0.39 exported it asGeneratedFile as Experimental_GeneratedImage, an unmarked alias. ai@7.0.40 gives the alias its own declared type and tags it: “UseGeneratedFileinstead. 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.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Deprecated Experimental_GeneratedImageai-npm-7.0.40-experimental-generated-image-deprecated | Deprecation |
| 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.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 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_ToolCallerReferenceis gone. The interface that described a tool caller reference,{ readonly toolName: NAME }, is no longer exported byai. The relatedExperimental_ToolCallerstype 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.MockVideoModelV4follows the new async video interface. The class inai/testnow declareshandleWebhookOption,doStartanddoStatusbesidedoGenerate, and its constructor options accept all three. The changelog says video models may now implementdoStart,doStatusandhandleWebhookOptioninstead of, or in addition to,doGenerate, and on theExperimental_VideoModelV4type in@ai-sdk/provider@4.0.5the mock’sdoGeneratemay now beundefined. 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.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Removed Experimental_ToolCallerReferenceai-npm-7.0.50-experimental-tool-caller-reference-removed | Breaking |
| Patch, only when you name a model provider | Your typecheck and tests |
Changed the members of MockVideoModelV4ai-npm-7.0.50-test-mock-video-model-v4-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.
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 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
rerankingModelis optional onProvider. In 7.0.62 it was declaredrerankingModel(modelId: string): RerankingModel. In 7.0.63 it isrerankingModel?(modelId: string): RerankingModel. Understrict, a call such asprovider.rerankingModel('id')on aProvideris 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.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of Providerai-npm-7.0.63-provider-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/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 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
messageMetadataSchemais typed fromUI_MESSAGE['metadata']. In 7.0.74 the option wasFlexibleSchema<InferUIMessageMetadata<UI_MESSAGE>>, whereInferUIMessageMetadatamatches the message againstUIMessage<infer METADATA>. In 7.0.76 it isFlexibleSchema<UI_MESSAGE['metadata']>. Becausemetadatais an optional property onUIMessage, the new type includesundefined, and it no longer depends on the message type matchingUIMessagethrough 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.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of ChatInitai-npm-7.0.76-chat-init-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/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 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_startTextBatchis nowexperimental_startBatch, and it takes a provider rather than a model.Experimental_StartTextBatchOptionsandExperimental_StartTextBatchResultgo with it, replaced byExperimental_StartBatchOptionsandExperimental_StartBatchResult. The new options carry an optionalprovider, which defaults to the global provider or to the Vercel AI Gateway, in place of the requiredmodel.- The batch-level
model,tools,toolChoice,toolOrderandtoolsContextmove onto each request. A request is now discriminated by modality:Experimental_TextBatchRequestkeeps its name but requirestype: 'text'and its ownmodel, andExperimental_BatchRequestis the union over modalities. Experimental_TextBatchandExperimental_TextBatchReferenceare gone.Experimental_BatchandExperimental_BatchReferencereplace them. The reference is a new shape as well as a new name:versionis2, and thetypeandmodelIdfields are no longer part of it, since a batch can hold requests against more than one model.Experimental_BatchOperationOptionssplits in two.experimental_getBatchStatusandexperimental_getBatchResultskeep their names, but now takeExperimental_GetBatchStatusOptionsandExperimental_GetBatchResultsOptions, each naming aproviderinstead of amodel.Experimental_BatchLanguageModelis gone. Nothing replaces the type directly. A model is a plain model id string on a request, and the provider is typed byExperimental_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.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Removed Experimental_BatchLanguageModelai-npm-7.0.94-experimental-batch-language-model-removed | Breaking |
| Patch, only when you name a model provider | Your typecheck and tests |
Removed Experimental_BatchOperationOptionsai-npm-7.0.94-experimental-batch-operation-options-removed | Breaking |
| Patch, only when you name a model provider | Your typecheck and tests |
Removed Experimental_StartTextBatchOptionsai-npm-7.0.94-experimental-start-text-batch-options-removed | Breaking |
| Patch, only when you name a model provider | Your typecheck and tests |
Removed Experimental_StartTextBatchResultai-npm-7.0.94-experimental-start-text-batch-result-removed | Breaking |
| Patch, only when you name a model provider | Your typecheck and tests |
Removed Experimental_TextBatchai-npm-7.0.94-experimental-text-batch-removed | Breaking |
| Patch, only when you name a model provider | Your typecheck and tests |
Removed Experimental_TextBatchReferenceai-npm-7.0.94-experimental-text-batch-reference-removed | Breaking |
| Patch, only when you name a model provider | Your typecheck and tests |
Removed experimental_startTextBatchai-npm-7.0.94-experimental-start-text-batch-removed | Breaking |
| Patch, only when you name a model provider | Your 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 | Breaking |
| Report only | Not applicable |
Removed model from the first argument of experimental_getBatchStatus()ai-npm-7.0.94-experimental-get-batch-status-argument-1-model-removed | Breaking |
| Report only | Not 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 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_AbstractRealtimeSessiongains methods and changes return types.sendEventnow returnsPromise<void>rather thanvoid.connectgains an overload taking{ stream?, capture? }.sendAudio’s parameter is renamed frombase64Audiotoaudio. New public methods arrive:close(options?),resumeAudioCapture()andresumePlayback(), each returning a promise. A subclass that overridessendEventreturningvoid, or declares its ownclosewith another signature, no longer type checks.- Two
Experimental_RealtimeModelmethods become optional. On the v4 realtime model in@ai-sdk/provider@4.0.15,doCreateClientSecretandgetWebSocketConfigare now optional, beside new optionalcapabilities,createServerEventParser,doCreateWebRTCSession,getServerWebSocketConfigandgetWebRTCConfig. Calling either of the two directly on a model typed this way needs a guard. Experimental_RealtimeSessionOptions.apiis a union. It was{ token: string }. It is now one of a token, asessionendpoint for the WebRTC SDP exchange, or awebsocketURL with optionalprotocols. Passing{ token }still works; readingoptions.api.tokennow yieldsstring | undefined. Four optional timing settings arrive beside it:startupTimeoutMs,closeTimeoutMs,rtcDisconnectTimeoutMsandmaxPlaybackBufferSeconds.
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.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of Experimental_AbstractRealtimeSessionai-npm-7.0.102-experimental-abstract-realtime-session-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
Changed the members of Experimental_RealtimeModelai-npm-7.0.102-experimental-realtime-model-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
Changed the members of Experimental_RealtimeSessionOptionsai-npm-7.0.102-experimental-realtime-session-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/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 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_EvaluationMockModelV4is deprecated. Both the value and the type of that name now carry a@deprecatedtag pointing atExperimental_DecisionMockModelV4. Inai@7.0.127the same name was a plain export of the mock model class. Inai@7.0.128it is an alias ofExperimental_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 aDecisionname and the old name still works. The mapping isexperimental_evaluatetoexperimental_decide,Experimental_EvaluateStartEventtoExperimental_DecideStartEvent,Experimental_EvaluateEndEventtoExperimental_DecideEndEvent, andExperimental_EvaluationModel,Experimental_EvaluationQuestion,Experimental_EvaluationAnswer,Experimental_EvaluationResult,Experimental_EvaluationProviderRegistry,Experimental_EvaluationModelCallStartEvent,Experimental_EvaluationModelCallEndEventandExperimental_EvaluationUnsupportedQuestionTypeErroreach to the same name withDecisionin place ofEvaluation.
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.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Deprecated Experimental_EvaluationMockModelV4ai-npm-7.0.128-test-experimental-evaluation-mock-model-v4-deprecated | Deprecation |
| Patch, only when you name a model provider | Your typecheck and tests |
Deprecated Experimental_EvaluateEndEventai-npm-7.0.128-experimental-evaluate-end-event-deprecated | Deprecation |
| Patch, only when you name a model provider | Your typecheck and tests |
Deprecated Experimental_EvaluateStartEventai-npm-7.0.128-experimental-evaluate-start-event-deprecated | Deprecation |
| Patch, only when you name a model provider | Your typecheck and tests |
Deprecated Experimental_EvaluationAnswerai-npm-7.0.128-experimental-evaluation-answer-deprecated | Deprecation |
| Patch, only when you name a model provider | Your typecheck and tests |
Deprecated Experimental_EvaluationModelai-npm-7.0.128-experimental-evaluation-model-deprecated | Deprecation |
| Patch, only when you name a model provider | Your typecheck and tests |
Deprecated Experimental_EvaluationModelCallEndEventai-npm-7.0.128-experimental-evaluation-model-call-end-event-deprecated | Deprecation |
| Patch, only when you name a model provider | Your typecheck and tests |
Deprecated Experimental_EvaluationModelCallStartEventai-npm-7.0.128-experimental-evaluation-model-call-start-event-deprecated | Deprecation |
| Patch, only when you name a model provider | Your typecheck and tests |
Deprecated Experimental_EvaluationProviderRegistryai-npm-7.0.128-experimental-evaluation-provider-registry-deprecated | Deprecation |
| Patch, only when you name a model provider | Your typecheck and tests |
Deprecated Experimental_EvaluationQuestionai-npm-7.0.128-experimental-evaluation-question-deprecated | Deprecation |
| Patch, only when you name a model provider | Your typecheck and tests |
Deprecated Experimental_EvaluationResultai-npm-7.0.128-experimental-evaluation-result-deprecated | Deprecation |
| Patch, only when you name a model provider | Your typecheck and tests |
Deprecated Experimental_EvaluationUnsupportedQuestionTypeErrorai-npm-7.0.128-experimental-evaluation-unsupported-question-type-error-deprecated | Deprecation |
| Patch, only when you name a model provider | Your typecheck and tests |
Deprecated experimental_evaluateai-npm-7.0.128-experimental-evaluate-deprecated | Deprecation |
| 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.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 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
LanguageModelCallOptionsdeclaresreasoningdifferently. The changelog says addingmaxwidens thereasoningoption and the derivedReasoningLeveltype. Ordinary calls that use the existing reasoning levels are still accepted.CallSettingsfollows. In the declarations it is a deprecated alias ofLanguageModelCallOptionscombined withRequestOptions, minustimeout, so the same member change reaches it. Both findings are breaking, and the scan reports any import of either type fromaithat 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.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of CallSettingsai-npm-7.0.129-call-settings-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
Changed the members of LanguageModelCallOptionsai-npm-7.0.129-language-model-call-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/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 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_DecisionMockModelV4declaressupportedQuestionTypesdifferently. 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 newboxquestion type. The scan reports any import of this type fromai/testthat is named in a type position.Experimental_EvaluationMockModelV4follows. It is a deprecated alias ofExperimental_DecisionMockModelV4, so the same member change reaches it. It is a separate finding and is reported on its own imports fromai/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.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Changed the members of Experimental_EvaluationMockModelV4ai-npm-7.0.143-test-experimental-evaluation-mock-model-v4-members-changed | Breaking medium confidence |
| Patch, only when you name a model provider | Your typecheck and tests |
Changed the members of Experimental_DecisionMockModelV4ai-npm-7.0.143-test-experimental-decision-mock-model-v4-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/ai/7.0.143.json, snapshot 2026-10-17.2.
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
- AI SDK 7.0.0: what breaks when you upgrade ai from 6.x
- ai@6.0.312: metadata type changed on TelemetrySettings
- AI SDK 6.0.0: what breaks when you upgrade ai from 5.x
- AI SDK 5.0.0: what breaks when you upgrade ai from 4.x
- AI SDK 4.0: what breaks when the 2.x stream helpers go
The AI SDK migration guide lists every release page and says which to read for your upgrade.