@langchain/core 1.1.45 marks RunnableWithMessageHistory as deprecated. The class is still exported from @langchain/core/runnables, its constructor and its methods are unchanged, and code using it keeps working: the only difference between 1.1.44 and 1.1.45 is a @deprecated tag added to its declaration and to the compiled module beside it. Anyone wrapping a chain in it to carry conversation history is affected, and the marker names LangGraph’s built-in persistence as the route out.
What changed
RunnableWithMessageHistoryis deprecated, not removed. Its declaration in@langchain/core/runnablesgains@deprecated Use LangGraph's built-in persistence instead.Nothing else about it moved: it still extendsRunnableBinding, still takesRunnableWithMessageHistoryInputswithgetMessageHistory, and the package’s exports map is identical to the one 1.1.44 shipped. Emendant reports each import of the name from that module, so you can count the call sites before a later major removes it.
Before and after
A chain wrapper built on the deprecated class:
import { RunnableWithMessageHistory } from '@langchain/core/runnables';
export { RunnableWithMessageHistory };Emendant reports this import. No transform writes it and there is nothing to rename. The replacement the marker points at is LangGraph’s persistence layer, which holds state outside the runnable rather than wrapping it, so the migration changes where history lives and not just which name is imported. That is a decision per chain, not a mechanical rewrite.
The matcher follows the module a name came from, not the name by itself. RunnableWithMessageHistory imported from a local compatibility module or from a vendored copy of the class is not this finding, and Emendant does not report it.
Migration guidance and its limits
This entry carries an assisted fix. Naming a model provider on the command line or in emendant.json lets fix try it, and without one the finding is reported with its guidance and nothing is sent anywhere. Do not count on a patch. The class is deprecated rather than removed and still works, so the guidance asks for a rewrite only where the release names a direct replacement with the same behaviour, and moving history into LangGraph’s persistence layer is neither.
Nothing breaks at this release. A deprecated class that still compiles and still runs buys you the time to move deliberately, and the declaration does not say which release will remove it. Read the scan as an inventory of call sites rather than as a list of failures.
A clean scan is narrower than the release. 1.1.45 also adds @deprecated markers to streamLog and to streamEvents called with version: "v1", and both are methods on Runnable rather than named exports, so this coverage does not carry them. If your code calls either, the scan will not say so. It says nothing about the rest of 1.1.45 either, or about any release between your installed version and this one.
What Emendant detects, fixes and verifies
1 change in @langchain/core 1.1.45. 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.
| Change | Severity | Detects | Fix | Verified by |
|---|---|---|---|---|
Deprecated RunnableWithMessageHistorylangchain-core-npm-1.1.45-runnables-runnable-with-message-history-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.
Coverage
- Snapshot
2026-09-20.1, sequence 27, signed 20 September 2026- Minimum CLI
emendant@0.1.0- Feed entry
feed/npm/@langchain/core/1.1.45.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.
- @langchain/core@1.1.45npm registry, the published package
- @langchain/core@1.1.44npm registry, the published package
Scan your repository
Runs locally, reads your lockfile and source, sends nothing anywhere.
npx emendant scanThen npx emendant fix writes the patches the table says exist. The getting started guide covers the flags and the patch grades.