Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-langgraph-sdk for
openSUSE:Factory checked in at 2026-10-15 12:25:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-langgraph-sdk (Old)
and /work/SRC/openSUSE:Factory/.python-langgraph-sdk.new.3698736 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-langgraph-sdk"
Thu Oct 15 12:25:35 2026 rev:7 rq:1384882 version:0.4.7
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-langgraph-sdk/python-langgraph-sdk.changes
2026-10-08 12:00:17.910250560 +0200
+++
/work/SRC/openSUSE:Factory/.python-langgraph-sdk.new.3698736/python-langgraph-sdk.changes
2026-10-15 12:25:38.920898128 +0200
@@ -1,0 +2,7 @@
+Thu Oct 15 04:46:41 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to 0.4.7:
+ * End a thread stream run only on a root lifecycle event
+ * Order delta channel replay by task path
+
+-------------------------------------------------------------------
Old:
----
langgraph_sdk-0.4.6.tar.gz
New:
----
langgraph_sdk-0.4.7.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-langgraph-sdk.spec ++++++
--- /var/tmp/diff_new_pack.LBsE1C/_old 2026-10-15 12:25:39.787934408 +0200
+++ /var/tmp/diff_new_pack.LBsE1C/_new 2026-10-15 12:25:39.788934450 +0200
@@ -18,7 +18,7 @@
%{?sle15_python_module_pythons}
Name: python-langgraph-sdk
-Version: 0.4.6
+Version: 0.4.7
Release: 0
Summary: SDK for interacting with the LangGraph API
License: MIT
++++++ langgraph_sdk-0.4.6.tar.gz -> langgraph_sdk-0.4.7.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langgraph_sdk-0.4.6/PKG-INFO
new/langgraph_sdk-0.4.7/PKG-INFO
--- old/langgraph_sdk-0.4.6/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
+++ new/langgraph_sdk-0.4.7/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.5
Name: langgraph-sdk
-Version: 0.4.6
+Version: 0.4.7
Summary: SDK for interacting with LangGraph API
Project-URL: Source,
https://github.com/langchain-ai/langgraph/tree/main/libs/sdk-py
Project-URL: Twitter, https://x.com/langchain_oss
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langgraph_sdk-0.4.6/integration/Dockerfile
new/langgraph_sdk-0.4.7/integration/Dockerfile
--- old/langgraph_sdk-0.4.6/integration/Dockerfile 2020-02-02
01:00:00.000000000 +0100
+++ new/langgraph_sdk-0.4.7/integration/Dockerfile 2020-02-02
01:00:00.000000000 +0100
@@ -22,18 +22,23 @@
"langchain>=1.3.0" \
"deepagents>=0.6.2"
-# Swap the published langgraph *core* for this monorepo's local copy, so the
-# server executes the langgraph under test rather than the latest release.
+# Swap the published langgraph *core* and *checkpoint* for this monorepo's
+# local copies, so the server executes the langgraph under test rather than the
+# latest release.
# We keep the rest of the base image (langgraph-api, runtime, Go core server)
# on `latest` — that still surfaces upstream regressions — but the core the
# server runs is now the PR's, which is what lets this suite catch core
# regressions (e.g. ensure_config / runtime changes) before they're published.
-# `--no-deps` keeps the base image's already-compatible
-# checkpoint/prebuilt/sdk; we only replace core. The local source comes from
-# the `langgraph_src` additional build context (see docker-compose.yml).
+# Checkpoint goes with core because core can need a checkpoint API from the
+# same release. `--no-deps` keeps the base image's already-compatible
+# prebuilt/sdk. The local sources come from the `checkpoint_src` and
+# `langgraph_src` additional build contexts (see docker-compose.yml).
+COPY --from=checkpoint_src pyproject.toml README.md LICENSE
/opt/checkpoint-src/
+COPY --from=checkpoint_src langgraph /opt/checkpoint-src/langgraph/
COPY --from=langgraph_src pyproject.toml README.md LICENSE /opt/langgraph-src/
COPY --from=langgraph_src langgraph /opt/langgraph-src/langgraph/
-RUN pip install --no-cache-dir --force-reinstall --no-deps /opt/langgraph-src
+RUN pip install --no-cache-dir --force-reinstall --no-deps \
+ /opt/checkpoint-src /opt/langgraph-src
# Project graphs + registration config.
COPY graph/ /app/graph/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langgraph_sdk-0.4.6/integration/docker-compose.yml
new/langgraph_sdk-0.4.7/integration/docker-compose.yml
--- old/langgraph_sdk-0.4.6/integration/docker-compose.yml 2020-02-02
01:00:00.000000000 +0100
+++ new/langgraph_sdk-0.4.7/integration/docker-compose.yml 2020-02-02
01:00:00.000000000 +0100
@@ -38,16 +38,17 @@
# see ./Dockerfile. The base image bundles langgraph-api +
# langgraph_runtime_postgres + langgraph_license + the Go core-server;
# on top we add graph deps (deepagents), the graph files, and this
- # monorepo's local langgraph *core* (so the server runs the code under
- # test, not the released langgraph).
+ # monorepo's local langgraph *core* and *checkpoint* (so the server runs
+ # the code under test, not the released langgraph).
build:
context: .
dockerfile: Dockerfile
additional_contexts:
- # The monorepo's local langgraph core (libs/langgraph), installed over
- # the base image so the server runs the langgraph under test. See the
- # Dockerfile for why.
+ # The monorepo's local langgraph core (libs/langgraph) and checkpoint
+ # (libs/checkpoint), installed over the base image so the server runs
+ # the langgraph under test. See the Dockerfile for why.
langgraph_src: ../../langgraph
+ checkpoint_src: ../../checkpoint
image: langgraph-v3-integration-api:local
depends_on:
postgres:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langgraph_sdk-0.4.6/langgraph_sdk/__init__.py
new/langgraph_sdk-0.4.7/langgraph_sdk/__init__.py
--- old/langgraph_sdk-0.4.6/langgraph_sdk/__init__.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langgraph_sdk-0.4.7/langgraph_sdk/__init__.py 2020-02-02
01:00:00.000000000 +0100
@@ -3,7 +3,7 @@
from langgraph_sdk.encryption import Encryption
from langgraph_sdk.encryption.types import DecryptResult, EncryptionContext
-__version__ = "0.4.6"
+__version__ = "0.4.7"
__all__ = [
"Auth",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langgraph_sdk-0.4.6/langgraph_sdk/_async/stream.py
new/langgraph_sdk-0.4.7/langgraph_sdk/_async/stream.py
--- old/langgraph_sdk-0.4.6/langgraph_sdk/_async/stream.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langgraph_sdk-0.4.7/langgraph_sdk/_async/stream.py 2020-02-02
01:00:00.000000000 +0100
@@ -1972,7 +1972,7 @@
# Mark that we have observed an active run so thread.output
# knows a run exists (handles reattach without run.start).
self._run_seen = True
- elif phase in ("completed", "failed"):
+ elif _is_root_terminal_lifecycle(event):
# Why: interrupts describe current-run state. Clear on terminal
# lifecycle so a subsequent run.respond() can't fire against a
# stale prior-run interrupt_id. Acquire `_interrupts_lock` so
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langgraph_sdk-0.4.6/langgraph_sdk/_sync/stream.py
new/langgraph_sdk-0.4.7/langgraph_sdk/_sync/stream.py
--- old/langgraph_sdk-0.4.6/langgraph_sdk/_sync/stream.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langgraph_sdk-0.4.7/langgraph_sdk/_sync/stream.py 2020-02-02
01:00:00.000000000 +0100
@@ -35,7 +35,11 @@
validate_interleave_channels,
)
from langgraph_sdk.stream.subscription import compute_union_filter,
infer_channel
-from langgraph_sdk.stream.sync_controller import SyncStreamController,
_SyncSubscription
+from langgraph_sdk.stream.sync_controller import (
+ SyncStreamController,
+ _is_root_terminal_lifecycle,
+ _SyncSubscription,
+)
from langgraph_sdk.stream.transport import (
SyncEventStreamHandle,
SyncProtocolSseTransport,
@@ -1614,7 +1618,7 @@
phase = data.get("event") if isinstance(data, dict) else None
if phase in ("started", "running"):
self._run_seen = True
- elif phase in ("completed", "failed"):
+ elif _is_root_terminal_lifecycle(event):
self.interrupted = False
self.interrupts = []
run_done = self._run_done
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langgraph_sdk-0.4.6/tests/streaming/test_lifecycle_watcher.py
new/langgraph_sdk-0.4.7/tests/streaming/test_lifecycle_watcher.py
--- old/langgraph_sdk-0.4.6/tests/streaming/test_lifecycle_watcher.py
2020-02-02 01:00:00.000000000 +0100
+++ new/langgraph_sdk-0.4.7/tests/streaming/test_lifecycle_watcher.py
2020-02-02 01:00:00.000000000 +0100
@@ -15,6 +15,7 @@
from streaming._events import (
input_requested_event,
lifecycle_completed_event,
+ lifecycle_errored_event,
lifecycle_event,
)
from streaming._fake_server import FakeServer, _StreamScript
@@ -115,6 +116,25 @@
assert thread.interrupts == []
+async def test_subgraph_completed_event_does_not_end_run():
+ fake = FakeServer()
+ fake.script(
+ [
+ lifecycle_completed_event(seq=0, namespace=["child:1"]),
+ lifecycle_errored_event(seq=1, error="root failed"),
+ ]
+ )
+ asgi = httpx.ASGITransport(app=fake.app)
+ async with httpx.AsyncClient(transport=asgi, base_url="http://test") as
raw:
+ threads = ThreadsClient(HttpClient(raw))
+ async with threads.stream(thread_id="t-1", assistant_id="agent") as
thread:
+ run_done = thread._run_done
+ assert run_done is not None
+ terminal = await asyncio.wait_for(run_done, timeout=2.0)
+ assert terminal.status == "errored", "a subgraph's completed event ended
the run"
+ assert "root failed" in str(terminal.error)
+
+
async def test_lifecycle_error_captured_for_output():
"""Lifecycle error terminal state is captured in _run_done with error
set."""
fake = FakeServer()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langgraph_sdk-0.4.6/tests/streaming/test_sync_thread_stream.py
new/langgraph_sdk-0.4.7/tests/streaming/test_sync_thread_stream.py
--- old/langgraph_sdk-0.4.6/tests/streaming/test_sync_thread_stream.py
2020-02-02 01:00:00.000000000 +0100
+++ new/langgraph_sdk-0.4.7/tests/streaming/test_sync_thread_stream.py
2020-02-02 01:00:00.000000000 +0100
@@ -27,6 +27,7 @@
checkpoints_event,
custom_event,
lifecycle_completed_event,
+ lifecycle_errored_event,
lifecycle_event,
lifecycle_started_event,
message_finish_event,
@@ -475,6 +476,23 @@
assert fake.stream_request_bodies[1]["since"] == 1
+def test_sync_subgraph_completed_event_does_not_end_run():
+ fake = SyncFakeServer()
+ fake.script(
+ [
+ lifecycle_completed_event(seq=1, namespace=["child:1"]),
+ lifecycle_errored_event(seq=2, error="root failed"),
+ ]
+ )
+ with httpx.Client(transport=fake.transport, base_url="http://test") as raw:
+ threads = SyncThreadsClient(SyncHttpClient(raw))
+ with threads.stream(thread_id="existing", assistant_id="agent") as
thread:
+ terminal = thread._wait_for_run_done()
+
+ assert terminal.status == "errored", "a subgraph's completed event ended
the run"
+ assert "root failed" in str(terminal.error)
+
+
def test_sync_threads_stream_accepts_websocket_transport_option():
with httpx.Client(base_url="http://test") as raw:
threads = SyncThreadsClient(SyncHttpClient(raw))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langgraph_sdk-0.4.6/uv.lock
new/langgraph_sdk-0.4.7/uv.lock
--- old/langgraph_sdk-0.4.6/uv.lock 2020-02-02 01:00:00.000000000 +0100
+++ new/langgraph_sdk-0.4.7/uv.lock 2020-02-02 01:00:00.000000000 +0100
@@ -301,7 +301,7 @@
[[package]]
name = "langgraph"
-version = "1.2.13"
+version = "1.2.15"
source = { editable = "../langgraph" }
dependencies = [
{ name = "langchain-core" },
@@ -385,7 +385,7 @@
[[package]]
name = "langgraph-checkpoint"
-version = "4.2.0"
+version = "4.3.0"
source = { editable = "../checkpoint" }
dependencies = [
{ name = "langchain-core" },