diff --git a/libs/langgraph/langgraph/graph/graph.py b/libs/langgraph/langgraph/graph/graph.py index ba2c8df72..137eb0862 100644 --- a/libs/langgraph/langgraph/graph/graph.py +++ b/libs/langgraph/langgraph/graph/graph.py @@ -472,7 +472,7 @@ class CompiledGraph(Pregel): ) subgraph.trim_first_node() subgraph.trim_last_node() - if len(subgraph.nodes) > 1: + if len(subgraph.nodes) >= 1: e, s = graph.extend(subgraph, prefix=key) if e is None: raise ValueError( diff --git a/libs/langgraph/poetry.lock b/libs/langgraph/poetry.lock index c75b9f6f7..ef04df931 100644 --- a/libs/langgraph/poetry.lock +++ b/libs/langgraph/poetry.lock @@ -1324,19 +1324,19 @@ files = [ [[package]] name = "langchain-core" -version = "0.3.30" +version = "0.3.44" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" groups = ["main", "dev"] files = [ - {file = "langchain_core-0.3.30-py3-none-any.whl", hash = "sha256:0a4c4e02fac5968b67fbb0142c00c2b976c97e45fce62c7ac9eb1636a6926493"}, - {file = "langchain_core-0.3.30.tar.gz", hash = "sha256:0f1281b4416977df43baf366633ad18e96c5dcaaeae6fcb8a799f9889c853243"}, + {file = "langchain_core-0.3.44-py3-none-any.whl", hash = "sha256:d989ce8bd62f1d07765acd575e6ec1254aec0cf7775aaea39fe4af8102377459"}, + {file = "langchain_core-0.3.44.tar.gz", hash = "sha256:7c0a01e78360f007cbca448178fe7e032404068e6431dbe8ce905f84febbdfa5"}, ] [package.dependencies] jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.1.125,<0.3" +langsmith = ">=0.1.125,<0.4" packaging = ">=23.2,<25" pydantic = [ {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, @@ -1348,7 +1348,7 @@ typing-extensions = ">=4.7" [[package]] name = "langgraph-checkpoint" -version = "2.0.16" +version = "2.0.18" description = "Library with base interfaces for LangGraph checkpoint savers." optional = false python-versions = "^3.9.0,<4.0" @@ -1366,7 +1366,7 @@ url = "../checkpoint" [[package]] name = "langgraph-checkpoint-postgres" -version = "2.0.15" +version = "2.0.16" description = "Library with a Postgres implementation of LangGraph checkpoint saver." optional = false python-versions = "^3.9.0,<4.0" @@ -1386,7 +1386,7 @@ url = "../checkpoint-postgres" [[package]] name = "langgraph-checkpoint-sqlite" -version = "2.0.5" +version = "2.0.6" description = "Library with a SQLite implementation of LangGraph checkpoint saver." optional = false python-versions = "^3.9.0" @@ -1404,7 +1404,7 @@ url = "../checkpoint-sqlite" [[package]] name = "langgraph-prebuilt" -version = "0.1.1" +version = "0.1.2" description = "Library with high-level APIs for creating and executing LangGraph agents and tools." optional = false python-versions = "^3.9.0,<4.0" @@ -1422,7 +1422,7 @@ url = "../prebuilt" [[package]] name = "langgraph-sdk" -version = "0.1.53" +version = "0.1.55" description = "SDK for interacting with LangGraph API" optional = false python-versions = "^3.9.0,<4.0" diff --git a/libs/langgraph/tests/__snapshots__/test_large_cases.ambr b/libs/langgraph/tests/__snapshots__/test_large_cases.ambr index 017b1aa9b..62517bcb7 100644 --- a/libs/langgraph/tests/__snapshots__/test_large_cases.ambr +++ b/libs/langgraph/tests/__snapshots__/test_large_cases.ambr @@ -3116,8 +3116,6 @@ __start__([

__start__

]):::first router_node(router_node) normal_llm_node(normal_llm_node) - weather_graph_model_node(model_node) - weather_graph_weather_node(weather_node
__interrupt = before) __end__([

__end__

]):::last __start__ --> router_node; normal_llm_node --> __end__; @@ -3126,6 +3124,8 @@ router_node -.-> weather_graph_model_node; router_node -.-> __end__; subgraph weather_graph + weather_graph_model_node(model_node) + weather_graph_weather_node(weather_node
__interrupt = before) weather_graph_model_node --> weather_graph_weather_node; end classDef default fill:#f2f0ff,line-height:1.2 @@ -3141,8 +3141,6 @@ __start__([

__start__

]):::first router_node(router_node) normal_llm_node(normal_llm_node) - weather_graph_model_node(model_node) - weather_graph_weather_node(weather_node
__interrupt = before) __end__([

__end__

]):::last __start__ --> router_node; normal_llm_node --> __end__; @@ -3151,6 +3149,8 @@ router_node -.-> weather_graph_model_node; router_node -.-> __end__; subgraph weather_graph + weather_graph_model_node(model_node) + weather_graph_weather_node(weather_node
__interrupt = before) weather_graph_model_node --> weather_graph_weather_node; end classDef default fill:#f2f0ff,line-height:1.2 @@ -3166,8 +3166,6 @@ __start__([

__start__

]):::first router_node(router_node) normal_llm_node(normal_llm_node) - weather_graph_model_node(model_node) - weather_graph_weather_node(weather_node
__interrupt = before) __end__([

__end__

]):::last __start__ --> router_node; normal_llm_node --> __end__; @@ -3176,6 +3174,8 @@ router_node -.-> weather_graph_model_node; router_node -.-> __end__; subgraph weather_graph + weather_graph_model_node(model_node) + weather_graph_weather_node(weather_node
__interrupt = before) weather_graph_model_node --> weather_graph_weather_node; end classDef default fill:#f2f0ff,line-height:1.2 @@ -3191,8 +3191,6 @@ __start__([

__start__

]):::first router_node(router_node) normal_llm_node(normal_llm_node) - weather_graph_model_node(model_node) - weather_graph_weather_node(weather_node
__interrupt = before) __end__([

__end__

]):::last __start__ --> router_node; normal_llm_node --> __end__; @@ -3201,6 +3199,8 @@ router_node -.-> weather_graph_model_node; router_node -.-> __end__; subgraph weather_graph + weather_graph_model_node(model_node) + weather_graph_weather_node(weather_node
__interrupt = before) weather_graph_model_node --> weather_graph_weather_node; end classDef default fill:#f2f0ff,line-height:1.2 @@ -3216,8 +3216,6 @@ __start__([

__start__

]):::first router_node(router_node) normal_llm_node(normal_llm_node) - weather_graph_model_node(model_node) - weather_graph_weather_node(weather_node
__interrupt = before) __end__([

__end__

]):::last __start__ --> router_node; normal_llm_node --> __end__; @@ -3226,6 +3224,8 @@ router_node -.-> weather_graph_model_node; router_node -.-> __end__; subgraph weather_graph + weather_graph_model_node(model_node) + weather_graph_weather_node(weather_node
__interrupt = before) weather_graph_model_node --> weather_graph_weather_node; end classDef default fill:#f2f0ff,line-height:1.2 @@ -3241,8 +3241,6 @@ __start__([

__start__

]):::first router_node(router_node) normal_llm_node(normal_llm_node) - weather_graph_model_node(model_node) - weather_graph_weather_node(weather_node
__interrupt = before) __end__([

__end__

]):::last __start__ --> router_node; normal_llm_node --> __end__; @@ -3251,6 +3249,8 @@ router_node -.-> weather_graph_model_node; router_node -.-> __end__; subgraph weather_graph + weather_graph_model_node(model_node) + weather_graph_weather_node(weather_node
__interrupt = before) weather_graph_model_node --> weather_graph_weather_node; end classDef default fill:#f2f0ff,line-height:1.2 diff --git a/libs/langgraph/tests/__snapshots__/test_large_cases_async.ambr b/libs/langgraph/tests/__snapshots__/test_large_cases_async.ambr index 898dd4f89..107532c66 100644 --- a/libs/langgraph/tests/__snapshots__/test_large_cases_async.ambr +++ b/libs/langgraph/tests/__snapshots__/test_large_cases_async.ambr @@ -6,8 +6,6 @@ __start__([

__start__

]):::first router_node(router_node) normal_llm_node(normal_llm_node) - weather_graph_model_node(model_node) - weather_graph_weather_node(weather_node
__interrupt = before) __end__([

__end__

]):::last __start__ --> router_node; normal_llm_node --> __end__; @@ -16,6 +14,8 @@ router_node -.-> weather_graph_model_node; router_node -.-> __end__; subgraph weather_graph + weather_graph_model_node(model_node) + weather_graph_weather_node(weather_node
__interrupt = before) weather_graph_model_node --> weather_graph_weather_node; end classDef default fill:#f2f0ff,line-height:1.2 @@ -31,8 +31,6 @@ __start__([

__start__

]):::first router_node(router_node) normal_llm_node(normal_llm_node) - weather_graph_model_node(model_node) - weather_graph_weather_node(weather_node
__interrupt = before) __end__([

__end__

]):::last __start__ --> router_node; normal_llm_node --> __end__; @@ -41,6 +39,8 @@ router_node -.-> weather_graph_model_node; router_node -.-> __end__; subgraph weather_graph + weather_graph_model_node(model_node) + weather_graph_weather_node(weather_node
__interrupt = before) weather_graph_model_node --> weather_graph_weather_node; end classDef default fill:#f2f0ff,line-height:1.2 @@ -56,8 +56,6 @@ __start__([

__start__

]):::first router_node(router_node) normal_llm_node(normal_llm_node) - weather_graph_model_node(model_node) - weather_graph_weather_node(weather_node
__interrupt = before) __end__([

__end__

]):::last __start__ --> router_node; normal_llm_node --> __end__; @@ -66,6 +64,8 @@ router_node -.-> weather_graph_model_node; router_node -.-> __end__; subgraph weather_graph + weather_graph_model_node(model_node) + weather_graph_weather_node(weather_node
__interrupt = before) weather_graph_model_node --> weather_graph_weather_node; end classDef default fill:#f2f0ff,line-height:1.2 @@ -81,8 +81,6 @@ __start__([

__start__

]):::first router_node(router_node) normal_llm_node(normal_llm_node) - weather_graph_model_node(model_node) - weather_graph_weather_node(weather_node
__interrupt = before) __end__([

__end__

]):::last __start__ --> router_node; normal_llm_node --> __end__; @@ -91,6 +89,8 @@ router_node -.-> weather_graph_model_node; router_node -.-> __end__; subgraph weather_graph + weather_graph_model_node(model_node) + weather_graph_weather_node(weather_node
__interrupt = before) weather_graph_model_node --> weather_graph_weather_node; end classDef default fill:#f2f0ff,line-height:1.2 @@ -106,8 +106,6 @@ __start__([

__start__

]):::first router_node(router_node) normal_llm_node(normal_llm_node) - weather_graph_model_node(model_node) - weather_graph_weather_node(weather_node
__interrupt = before) __end__([

__end__

]):::last __start__ --> router_node; normal_llm_node --> __end__; @@ -116,6 +114,8 @@ router_node -.-> weather_graph_model_node; router_node -.-> __end__; subgraph weather_graph + weather_graph_model_node(model_node) + weather_graph_weather_node(weather_node
__interrupt = before) weather_graph_model_node --> weather_graph_weather_node; end classDef default fill:#f2f0ff,line-height:1.2 @@ -131,8 +131,6 @@ __start__([

__start__

]):::first router_node(router_node) normal_llm_node(normal_llm_node) - weather_graph_model_node(model_node) - weather_graph_weather_node(weather_node
__interrupt = before) __end__([

__end__

]):::last __start__ --> router_node; normal_llm_node --> __end__; @@ -141,6 +139,8 @@ router_node -.-> weather_graph_model_node; router_node -.-> __end__; subgraph weather_graph + weather_graph_model_node(model_node) + weather_graph_weather_node(weather_node
__interrupt = before) weather_graph_model_node --> weather_graph_weather_node; end classDef default fill:#f2f0ff,line-height:1.2 diff --git a/libs/langgraph/tests/__snapshots__/test_pregel.ambr b/libs/langgraph/tests/__snapshots__/test_pregel.ambr index b54324b06..c751b924f 100644 --- a/libs/langgraph/tests/__snapshots__/test_pregel.ambr +++ b/libs/langgraph/tests/__snapshots__/test_pregel.ambr @@ -1722,13 +1722,13 @@ __start__([

__start__

]):::first uno(uno) dos(dos) - subgraph_one(one) - subgraph_two(two) - subgraph_three(three) __start__ --> uno; uno -.-> dos; uno -.-> subgraph_one; subgraph subgraph + subgraph_one(one) + subgraph_two(two) + subgraph_three(three) subgraph_one -.-> subgraph_two; subgraph_one -.-> subgraph_three; end @@ -1752,12 +1752,14 @@ %%{init: {'flowchart': {'curve': 'linear'}}}%% graph TD; __start__([

__start__

]):::first - inner(inner) side(side) __end__([

__end__

]):::last - __start__ --> inner; - inner --> side; + __start__ --> inner_up; + inner_up --> side; side --> __end__; + subgraph inner + inner_up(up) + end classDef default fill:#f2f0ff,line-height:1.2 classDef first fill-opacity:0 classDef last fill:#bfb6fc @@ -1895,10 +1897,6 @@ graph TD; __start__([

__start__

]):::first tool_one(tool_one) - tool_two___start__(

__start__

) - tool_two_tool_two_slow(tool_two_slow) - tool_two_tool_two_fast(tool_two_fast) - tool_two___end__(

__end__

) tool_three(tool_three) __end__([

__end__

]):::last __start__ -.-> tool_one; @@ -1908,6 +1906,10 @@ __start__ -.-> tool_three; tool_three --> __end__; subgraph tool_two + tool_two___start__(

__start__

) + tool_two_tool_two_slow(tool_two_slow) + tool_two_tool_two_fast(tool_two_fast) + tool_two___end__(

__end__

) tool_two___start__ -.-> tool_two_tool_two_slow; tool_two_tool_two_slow --> tool_two___end__; tool_two___start__ -.-> tool_two_tool_two_fast; @@ -1962,24 +1964,24 @@ graph TD; __start__([

__start__

]):::first gp_one(gp_one) - gp_two___start__(

__start__

) - gp_two_p_one(p_one) - gp_two_p_two___start__(

__start__

) - gp_two_p_two_c_one(c_one) - gp_two_p_two_c_two(c_two) - gp_two_p_two___end__(

__end__

) - gp_two___end__(

__end__

) __end__([

__end__

]):::last __start__ --> gp_one; gp_two___end__ --> gp_one; gp_one -.  0  .-> gp_two___start__; gp_one -.  1  .-> __end__; subgraph gp_two + gp_two___start__(

__start__

) + gp_two_p_one(p_one) + gp_two___end__(

__end__

) gp_two___start__ --> gp_two_p_one; gp_two_p_two___end__ --> gp_two_p_one; gp_two_p_one -.  0  .-> gp_two_p_two___start__; gp_two_p_one -.  1  .-> gp_two___end__; subgraph p_two + gp_two_p_two___start__(

__start__

) + gp_two_p_two_c_one(c_one) + gp_two_p_two_c_two(c_two) + gp_two_p_two___end__(

__end__

) gp_two_p_two___start__ --> gp_two_p_two_c_one; gp_two_p_two_c_two --> gp_two_p_two_c_one; gp_two_p_two_c_one -.  0  .-> gp_two_p_two_c_two; @@ -1998,16 +2000,16 @@ graph TD; __start__([

__start__

]):::first p_one(p_one) - p_two___start__(

__start__

) - p_two_c_one(c_one) - p_two_c_two(c_two) - p_two___end__(

__end__

) __end__([

__end__

]):::last __start__ --> p_one; p_two___end__ --> p_one; p_one -.  0  .-> p_two___start__; p_one -.  1  .-> __end__; subgraph p_two + p_two___start__(

__start__

) + p_two_c_one(c_one) + p_two_c_two(c_two) + p_two___end__(

__end__

) p_two___start__ --> p_two_c_one; p_two_c_two --> p_two_c_one; p_two_c_one -.  0  .-> p_two_c_two;