Compare commits

...
2 changed files with 62 additions and 8 deletions
+24 -4
View File
@@ -66,14 +66,34 @@ def _get_pip_cleanup_lines(
to_uninstall: tuple[str] | None,
pip_installer: Literal["uv", "pip"],
) -> str:
commands = [
f"""# -- Ensure user deps didn't inadvertently overwrite langgraph-api
commands = ["# -- Validate installed dependencies are internally consistent --"]
if pip_installer == "uv":
commands.append(
"""RUN uv pip check --system || ( \
echo "Dependency resolution check failed. One or more installed packages are incompatible."; \
echo "Pin compatible versions in your dependencies and try again."; \
exit 1 \
)"""
)
elif pip_installer == "pip":
commands.append(
"""RUN python -m pip check || ( \
echo "Dependency resolution check failed. One or more installed packages are incompatible."; \
echo "Pin compatible versions in your dependencies and try again."; \
exit 1 \
)"""
)
commands.append(
"""# -- End dependency validation --
# -- Ensure user deps didn't inadvertently overwrite langgraph-api
RUN mkdir -p /api/langgraph_api /api/langgraph_runtime /api/langgraph_license && \
touch /api/langgraph_api/__init__.py /api/langgraph_runtime/__init__.py /api/langgraph_license/__init__.py
RUN PYTHONDONTWRITEBYTECODE=1 {install_cmd} --no-cache-dir --no-deps -e /api
RUN PYTHONDONTWRITEBYTECODE=1 """
+ install_cmd
+ """ --no-cache-dir --no-deps -e /api
# -- End of ensuring user deps didn't inadvertently overwrite langgraph-api --
# -- Removing build deps from the final image ~<:===~~~ --"""
]
)
if to_uninstall:
for pack in to_uninstall:
if pack not in _BUILD_TOOLS:
+38 -4
View File
@@ -1330,6 +1330,8 @@ def test_config_to_docker_pip_installer():
PATH_TO_CONFIG, config_auto, base_image="langchain/langgraph-api:0.2.47"
)
assert "uv pip install --system " in docker_auto
assert "RUN uv pip check --system" in docker_auto
assert "python -m pip check" not in docker_auto
assert "rm /usr/bin/uv /usr/bin/uvx" in docker_auto
# Test explicit pip setting
@@ -1338,6 +1340,8 @@ def test_config_to_docker_pip_installer():
PATH_TO_CONFIG, config_pip, base_image="langchain/langgraph-api:0.2.47"
)
assert "uv pip install --system " not in docker_pip
assert "RUN uv pip check --system" not in docker_pip
assert "RUN python -m pip check" in docker_pip
assert "pip install" in docker_pip
assert "rm /usr/bin/uv" not in docker_pip
@@ -1347,6 +1351,8 @@ def test_config_to_docker_pip_installer():
PATH_TO_CONFIG, config_uv, base_image="langchain/langgraph-api:0.2.47"
)
assert "uv pip install --system " in docker_uv
assert "RUN uv pip check --system" in docker_uv
assert "python -m pip check" not in docker_uv
assert "rm /usr/bin/uv /usr/bin/uvx" in docker_uv
# Test auto behavior with older image (should use pip)
@@ -1357,6 +1363,8 @@ def test_config_to_docker_pip_installer():
PATH_TO_CONFIG, config_auto_old, base_image="langchain/langgraph-api:0.2.46"
)
assert "uv pip install --system " not in docker_auto_old
assert "RUN uv pip check --system" not in docker_auto_old
assert "RUN python -m pip check" in docker_auto_old
assert "pip install" in docker_auto_old
assert "rm /usr/bin/uv" not in docker_auto_old
@@ -1366,6 +1374,32 @@ def test_config_to_docker_pip_installer():
PATH_TO_CONFIG, config_default, base_image="langchain/langgraph-api:0.2.47"
)
assert "uv pip install --system " in docker_default
assert "RUN uv pip check --system" in docker_default
assert "python -m pip check" not in docker_default
def test_get_pip_cleanup_lines_selects_check_command_by_installer():
cleanup_uv = _get_pip_cleanup_lines(
install_cmd="uv pip install --system",
to_uninstall=None,
pip_installer="uv",
)
assert "RUN uv pip check --system" in cleanup_uv
assert "python -m pip check" not in cleanup_uv
assert cleanup_uv.index("RUN uv pip check --system") < cleanup_uv.index(
"RUN mkdir -p /api/langgraph_api"
)
cleanup_pip = _get_pip_cleanup_lines(
install_cmd="pip install",
to_uninstall=None,
pip_installer="pip",
)
assert "RUN python -m pip check" in cleanup_pip
assert "uv pip check --system" not in cleanup_pip
assert cleanup_pip.index("RUN python -m pip check") < cleanup_pip.index(
"RUN mkdir -p /api/langgraph_api"
)
def test_config_to_docker_uv_lock():
@@ -2490,7 +2524,7 @@ def test_config_to_compose_simple_config():
def test_config_to_compose_env_vars():
graphs = {"agent": "./agent.py:graph"}
expected_compose_stdin = f""" OPENAI_API_KEY: "key"
pull_policy: build
build:
context: .
@@ -2573,7 +2607,7 @@ def test_config_to_compose_env_file():
def test_config_to_compose_watch():
graphs = {"agent": "./agent.py:graph"}
expected_compose_stdin = f"""\
pull_policy: build
build:
context: .
@@ -2599,7 +2633,7 @@ def test_config_to_compose_watch():
ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}}'
{textwrap.indent(textwrap.dedent(FORMATTED_CLEANUP_LINES), " ")}
WORKDIR /deps/outer-unit_tests/unit_tests
develop:
watch:
- path: test_config.json
@@ -2646,7 +2680,7 @@ def test_config_to_compose_end_to_end():
ENV LANGSERVE_GRAPHS='{{"agent": "/deps/outer-unit_tests/unit_tests/agent.py:graph"}}'
{textwrap.indent(textwrap.dedent(FORMATTED_CLEANUP_LINES), " ")}
WORKDIR /deps/outer-unit_tests/unit_tests
develop:
watch:
- path: test_config.json