diff --git a/.github/scripts/run_langgraph_cli_test.py b/.github/scripts/run_langgraph_cli_test.py index cdead9c6d..e296ba7d5 100644 --- a/.github/scripts/run_langgraph_cli_test.py +++ b/.github/scripts/run_langgraph_cli_test.py @@ -63,7 +63,7 @@ def test(config: pathlib.Path, port: int, tag: str, verbose: bool): try: sys.stderr.write("\n== docker compose ps ==\n") runner.run( - subp_exec(*compose_cmd, *args, "ps", input=stdin, verbose=False) + subp_exec(*compose_cmd, *args, "ps", input=stdin, verbose=True) ) except Exception: pass @@ -76,7 +76,7 @@ def test(config: pathlib.Path, port: int, tag: str, verbose: bool): "logs", "langgraph-api", input=stdin, - verbose=False, + verbose=True, ) ) except Exception: diff --git a/.github/workflows/_integration_test.yml b/.github/workflows/_integration_test.yml index 3be88dae0..352f58511 100644 --- a/.github/workflows/_integration_test.yml +++ b/.github/workflows/_integration_test.yml @@ -96,8 +96,8 @@ jobs: timeout 60 python ../../../../.github/scripts/run_langgraph_cli_test.py -t langgraph-test-h echo "Finished starting up langgraph-test-h" LANGGRAPH_VERSION=$(docker run --rm --entrypoint "" langgraph-test-h python -c "import sys; from importlib.metadata import version; v = version('langgraph'); print(v);") - if [ "$LANGGRAPH_VERSION" != "1.0.2" ]; then - echo "LANGGRAPH_VERSION != 1.0.2; $LANGGRAPH_VERSION" + if [ "$LANGGRAPH_VERSION" != "1.0.8" ]; then + echo "LANGGRAPH_VERSION != 1.0.8; $LANGGRAPH_VERSION" exit 1 fi LANGCHAIN_OPENAI_VERSION=$(docker run --rm --entrypoint "" langgraph-test-h python -c "import sys; from importlib.metadata import version; v = version('langchain-openai'); print(v);") diff --git a/libs/cli/examples/graph_prerelease_reqs/deps/additional_deps/pyproject.toml b/libs/cli/examples/graph_prerelease_reqs/deps/additional_deps/pyproject.toml index c68fdf561..4df335816 100644 --- a/libs/cli/examples/graph_prerelease_reqs/deps/additional_deps/pyproject.toml +++ b/libs/cli/examples/graph_prerelease_reqs/deps/additional_deps/pyproject.toml @@ -5,5 +5,5 @@ description = "Test for prerelease stuff" readme = "README.md" requires-python = ">=3.10" dependencies = [ - "langgraph==1.0.2" + "langgraph==1.0.8" ] \ No newline at end of file diff --git a/libs/cli/examples/graph_prerelease_reqs/pyproject.toml b/libs/cli/examples/graph_prerelease_reqs/pyproject.toml index b0c1ab59a..a548185d0 100644 --- a/libs/cli/examples/graph_prerelease_reqs/pyproject.toml +++ b/libs/cli/examples/graph_prerelease_reqs/pyproject.toml @@ -7,7 +7,7 @@ requires-python = ">=3.10" dependencies = [ "langchain-openai==1.0.0a2", "langchain-anthropic==1.0.0a5", - "langgraph==1.0.2" + "langgraph==1.0.8" ] [tool.uv] diff --git a/libs/cli/langgraph_cli/config.py b/libs/cli/langgraph_cli/config.py index c21402eea..0e80b1e33 100644 --- a/libs/cli/langgraph_cli/config.py +++ b/libs/cli/langgraph_cli/config.py @@ -196,6 +196,11 @@ def validate_config(config: Config) -> Config: f"Python version {pyversion} is not supported. " f"Minimum required version is {MIN_PYTHON_VERSION}." ) + if "bullseye" in pyversion: + raise click.UsageError( + "Bullseye images were deprecated in version 0.4.13. " + "Please use 'bookworm' or 'debian' instead." + ) if not config["dependencies"]: raise click.UsageError( diff --git a/libs/cli/langgraph_cli/schemas.py b/libs/cli/langgraph_cli/schemas.py index 8b460e6ee..e87692dc1 100644 --- a/libs/cli/langgraph_cli/schemas.py +++ b/libs/cli/langgraph_cli/schemas.py @@ -107,17 +107,19 @@ class StoreConfig(TypedDict, total=False): class ThreadTTLConfig(TypedDict, total=False): """Configure a default TTL for checkpointed data within threads.""" - strategy: Literal["delete"] - """Strategy to use for deleting checkpointed data. - - Choices: - - "delete": Delete all checkpoints for a thread after TTL expires. + strategy: Literal["delete", "keep_latest"] + """Action taken when a thread exceeds its TTL. + + - "delete": Remove the thread and all its data entirely. + - "keep_latest": Prune old checkpoints but keep the thread and its latest state. """ default_ttl: float | None """Default TTL (time-to-live) in minutes for checkpointed data.""" sweep_interval_minutes: int | None """Interval in minutes between sweep iterations. If omitted, a default interval will be used (typically ~ 5 minutes).""" + sweep_limit: int | None + """Maximum number of threads to process per sweep iteration. Defaults to 1000.""" class SerdeConfig(TypedDict, total=False): @@ -173,14 +175,12 @@ class CheckpointerConfig(TypedDict, total=False): """ serde: SerdeConfig | None """Optional. Defines the serde configuration. - + If provided, the checkpointer will apply serde settings according to the configuration. If omitted, no serde behavior is configured. This configuration requires server version 0.5 or later to take effect. """ - sweep_limit: int | None - """Maximum number of threads to process per sweep iteration. Defaults to 1000.""" class SecurityConfig(TypedDict, total=False): diff --git a/libs/cli/schemas/schema.json b/libs/cli/schemas/schema.json index c9b774861..2d0a9eba8 100644 --- a/libs/cli/schemas/schema.json +++ b/libs/cli/schemas/schema.json @@ -553,17 +553,6 @@ ], "description": "Optional. Defines the serde configuration.\n\nIf provided, the checkpointer will apply serde settings according to the configuration.\nIf omitted, no serde behavior is configured.\n\nThis configuration requires server version 0.5 or later to take effect.\n" }, - "sweep_limit": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "description": "Maximum number of threads to process per sweep iteration. Defaults to 1000." - }, "ttl": { "anyOf": [ { @@ -628,9 +617,10 @@ }, "strategy": { "enum": [ - "delete" + "delete", + "keep_latest" ], - "description": "Strategy to use for deleting checkpointed data.\n" + "description": "Action taken when a thread exceeds its TTL.\n\n" }, "sweep_interval_minutes": { "anyOf": [ @@ -642,6 +632,17 @@ } ], "description": "Interval in minutes between sweep iterations.\nIf omitted, a default interval will be used (typically ~ 5 minutes)." + }, + "sweep_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "Maximum number of threads to process per sweep iteration. Defaults to 1000." } }, "required": [] diff --git a/libs/cli/schemas/schema.v0.json b/libs/cli/schemas/schema.v0.json index c9b774861..2d0a9eba8 100644 --- a/libs/cli/schemas/schema.v0.json +++ b/libs/cli/schemas/schema.v0.json @@ -553,17 +553,6 @@ ], "description": "Optional. Defines the serde configuration.\n\nIf provided, the checkpointer will apply serde settings according to the configuration.\nIf omitted, no serde behavior is configured.\n\nThis configuration requires server version 0.5 or later to take effect.\n" }, - "sweep_limit": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "description": "Maximum number of threads to process per sweep iteration. Defaults to 1000." - }, "ttl": { "anyOf": [ { @@ -628,9 +617,10 @@ }, "strategy": { "enum": [ - "delete" + "delete", + "keep_latest" ], - "description": "Strategy to use for deleting checkpointed data.\n" + "description": "Action taken when a thread exceeds its TTL.\n\n" }, "sweep_interval_minutes": { "anyOf": [ @@ -642,6 +632,17 @@ } ], "description": "Interval in minutes between sweep iterations.\nIf omitted, a default interval will be used (typically ~ 5 minutes)." + }, + "sweep_limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "Maximum number of threads to process per sweep iteration. Defaults to 1000." } }, "required": []