diff --git a/libs/cli/langgraph_cli/config.py b/libs/cli/langgraph_cli/config.py index a6357c347..3766a4bbe 100644 --- a/libs/cli/langgraph_cli/config.py +++ b/libs/cli/langgraph_cli/config.py @@ -1523,9 +1523,11 @@ def python_config_to_docker( if all_req_paths: # Stabilize order all_req_paths = sorted(set(all_req_paths)) + # Install each requirements.txt sequentially. This mimics the previous sequential solver behavior + # which allows to adjust/downgrade packages between installs, so no conflict is raised. pip_reqs_str = f"""# -- Installing from requirements.txt files -- {os.linesep.join(copy_lines)} -RUN {local_reqs_pip_install} {" ".join("-r '" + p + "'" for p in all_req_paths)} +{os.linesep.join(f"RUN {local_reqs_pip_install} -r '{p}'" for p in all_req_paths)} # -- End of requirements.txt install --""" # generate lock file if real package and lock file missing diff --git a/libs/cli/tests/unit_tests/cli/test_cli.py b/libs/cli/tests/unit_tests/cli/test_cli.py index e4c431bbb..4d4d289a3 100644 --- a/libs/cli/tests/unit_tests/cli/test_cli.py +++ b/libs/cli/tests/unit_tests/cli/test_cli.py @@ -154,7 +154,8 @@ services: RUN cd '/deps/cli_1' && uv export --no-hashes --no-dev -o 'requirements.txt' # -- End of requirements.txt generation -- # -- Installing from requirements.txt files -- - RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -r '/deps/cli/requirements.txt' -r '/deps/cli_1/requirements.txt' + RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -r '/deps/cli/requirements.txt' + RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -r '/deps/cli_1/requirements.txt' # -- End of requirements.txt install -- # -- Adding local package . -- ADD . /deps/cli diff --git a/libs/cli/tests/unit_tests/test_config.py b/libs/cli/tests/unit_tests/test_config.py index 052bc7c5d..eb87bb494 100644 --- a/libs/cli/tests/unit_tests/test_config.py +++ b/libs/cli/tests/unit_tests/test_config.py @@ -429,7 +429,8 @@ RUN cd '/deps/examples' && uv pip compile pyproject.toml -o 'requirements.txt' - # -- End of requirements.txt generation -- # -- Installing from requirements.txt files -- COPY --from=outer-graphs_reqs_a requirements.txt /deps/outer-graphs_reqs_a/graphs_reqs_a/requirements.txt -RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -r '/deps/examples/requirements.txt' -r '/deps/outer-graphs_reqs_a/graphs_reqs_a/requirements.txt' +RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -r '/deps/examples/requirements.txt' +RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -r '/deps/outer-graphs_reqs_a/graphs_reqs_a/requirements.txt' # -- End of requirements.txt install -- # -- Adding local package ../../examples -- COPY --from=examples . /deps/examples