ai@7.0.50 is a patch release, and one change in it breaks a typecheck: Experimental_ToolCallerReference is no longer exported from ai. The package’s own changelog files the removal under “simplify tool caller configuration,” alongside an unrelated async video API addition. Only code that imports Experimental_ToolCallerReference by name is affected.

What changed

Before and after

The import Emendant’s matcher looks for:

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

No transform can write this one, so there is no rewritten file to show. The shape change behind the removal is why, and it is worth seeing, because it is also what an assisted patch has to work out for itself. 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

This 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. Expect a decline here more often than a patch. The guidance tells the model to set fixed to false rather than invent a replacement, and what replaced this interface is a plain string inside another type rather than an exported name to swap in. A patch that is written is proved in a copy of your repository moved to 7.0.50 and put through whichever of your own typecheck and tests it finds there, and withheld if it fails.

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 matcher fires on the import statement alone. 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. This release’s other change, the async generateVideo polling and webhook APIs, is unrelated and not covered by this entry either. A clean scan says a file does not import this one name from ai, and nothing about the rest of the release.

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

What Emendant detects, fixes and verifies

1 change in ai 7.0.50. 0 patched by a transform, 1 patched only with a model provider you name, 0 report only. Every patch is proved in a copy of your repository before it is offered, and its header names the checks that passed. This table is generated from the feed entry, so it cannot claim more than the entry does.

ChangeSeverityDetectsFixVerified by
Removed Experimental_ToolCallerReference
ai-npm-7.0.50-experimental-tool-caller-reference-removed
Breaking
  • Experimental_ToolCallerReference 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.

Coverage

Snapshot
2026-09-20.1, sequence 27, signed 20 September 2026
Minimum CLI
emendant@0.1.0
Feed entry
feed/npm/ai/7.0.50.json

emendant feed status shows the snapshot your machine holds, and emendant feed update fetches the latest.

Primary sources

Every claim above was checked against these, each pinned to the release rather than to a default branch.

Scan your repository

Runs locally, reads your lockfile and source, sends nothing anywhere.

npx emendant scan

Then npx emendant fix writes the patches the table says exist. The getting started guide covers the flags and the patch grades.