diff --git a/pyproject.toml b/pyproject.toml index 3c2d2232..c6254db8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,15 +42,23 @@ cloudpickle = ">=2.0" # Agent framework integrations — optional, activated via [tool.poetry.extras] below. # Floors raised to the versions ConductorAgent's own uv.lock proved mutually compatible # (langchain's 0.3.x-floor collided with today's published 1.x line during resolution). -langchain = { version = ">=1.2.13", optional = true } -langchain-core = { version = ">=1.2.20", optional = true } -langchain-openai = { version = ">=1.1.11", optional = true } -langgraph = { version = ">=1.1.3", optional = true } -google-adk = { version = ">=1.27.1", optional = true } -openai = { version = ">=2.28.0", optional = true } -openai-agents = { version = ">=0.12.2", optional = true } -anthropic = { version = ">=0.91.0", optional = true } -claude-code-sdk = { version = ">=0.0.25", optional = true } +# +# CEILINGS: every one of these was previously unbounded (">=X" only), so +# `conductor-python[agents]` accepted any future major of langgraph/openai/anthropic/etc. +# A breaking upstream release therefore reached users — and the downstream e2e bundle's +# CI lanes — with no change here, presenting as an SDK or server regression. These are +# integration surfaces we call directly, so a major bump is exactly where they break. +# Caps are next-major (next-minor for the 0.x projects, whose minors are breaking by +# convention). Raise a cap deliberately, with a run of the agent suites behind it. +langchain = { version = ">=1.2.13,<2", optional = true } +langchain-core = { version = ">=1.2.20,<2", optional = true } +langchain-openai = { version = ">=1.1.11,<2", optional = true } +langgraph = { version = ">=1.1.3,<2", optional = true } +google-adk = { version = ">=1.27.1,<3", optional = true } +openai = { version = ">=2.28.0,<3", optional = true } +openai-agents = { version = ">=0.12.2,<0.13", optional = true } +anthropic = { version = ">=0.91.0,<0.121", optional = true } +claude-code-sdk = { version = ">=0.0.25,<0.1", optional = true } [tool.poetry.extras] langchain = ["langchain", "langchain-core", "langchain-openai"] diff --git a/scripts/package-e2e-bundle.sh b/scripts/package-e2e-bundle.sh index 43fab234..56db1d24 100755 --- a/scripts/package-e2e-bundle.sh +++ b/scripts/package-e2e-bundle.sh @@ -56,13 +56,18 @@ cat > "$STAGE/requirements.txt" <<'EOF' conductor-python[agents]==@VERSION@ # Test runner + e2e support deps (mirrors .github/workflows/agent-e2e.yml). -pytest -pytest-asyncio -pytest-xdist -pytest-rerunfailures +# Bounded, not bare: these were unpinned, so `pip install -r requirements.txt` inside +# run.sh resolved to whatever was newest on the day a downstream lane happened to run. +# A pytest or plugin major could then redden a consumer's gating CI with no change to +# this bundle — and look like a server regression to whoever triaged it. Floors are the +# versions this bundle was cut against; ceilings are next-major. +pytest>=8,<10 +pytest-asyncio>=1,<2 +pytest-xdist>=3,<4 +pytest-rerunfailures>=16,<17 # Live MCP server used by the MCP tool suites. -mcp-testkit +mcp-testkit>=1,<2 EOF cat > "$STAGE/run.sh" <<'EOF'