Repository navigation
Python: Drop 3.10 support and expand CI coverage through 3.14 - #14708
Eduard van Valkenburg (eavanvalkenburg) merged 12 commits into
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
The required Python 3.15 all-extras jobs fail before pytest because the exact onnxruntime-genai and torch pins have no compatible artifacts in the lockfile.
1 open issue
What changed in this PR
This PR raises the Python SDK minimum to 3.11, removes Python 3.10 compatibility code, and aligns CI and developer tooling with the updated version policy.
Changes:
- Expands required unit-test coverage to Python 3.11–3.15 and moves integration tests and local defaults to Python 3.14.
- Replaces obsolete typing backports, removes compatibility workarounds, and adds regression tests for
Anyhandler return annotations. - Updates package requirements, sample metadata, documentation, and development tools.
| File | Description |
|---|---|
| README.md | Updates supported Python versions. |
| python/tests/unit/kernel/test_kernel.py | Removes an outdated compatibility docstring. |
| python/tests/unit/data/conftest.py | Removes the Python 3.10 event-loop workaround. |
| python/tests/unit/agents/runtime/test_runtime.py | Tests Any returns for message and RPC handlers. |
| python/tests/unit/agents/orchestration/test_sequential.py | Removes Python 3.10-specific skips. |
| python/tests/unit/agents/orchestration/test_magentic.py | Removes Python 3.10-specific skips. |
| python/tests/unit/agents/orchestration/test_handoff.py | Removes Python 3.10-specific skips. |
| python/tests/unit/agents/orchestration/test_group_chat.py | Removes Python 3.10-specific skips. |
| python/tests/unit/agents/orchestration/test_concurrent.py | Removes Python 3.10-specific skips. |
| python/semantic_kernel/schema/kernel_json_schema_builder.py | Removes an obsolete comment; behavior is unchanged. |
| python/semantic_kernel/data/vector.py | Uses standard-library Self. |
| python/semantic_kernel/contents/streaming_content_mixin.py | Uses standard-library Self. |
| python/semantic_kernel/contents/history_reducer/chat_history_truncation_reducer.py | Removes the Self backport guard. |
| python/semantic_kernel/contents/history_reducer/chat_history_summarization_reducer.py | Removes the Self backport guard. |
| python/semantic_kernel/contents/history_reducer/chat_history_reducer.py | Uses standard-library Self. |
| python/semantic_kernel/connectors/weaviate.py | Uses standard-library Self. |
| python/semantic_kernel/connectors/sql_server.py | Uses standard-library Self. |
| python/semantic_kernel/connectors/mongodb.py | Uses standard-library Self. |
| python/semantic_kernel/connectors/mcp.py | Uses standard-library Self. |
| python/semantic_kernel/connectors/ai/realtime_client_base.py | Uses standard-library Self. |
| python/semantic_kernel/agents/runtime/core/type_helpers.py | Removes the AnyType compatibility shim. |
| python/semantic_kernel/agents/runtime/core/topic.py | Uses standard-library Self. |
| python/semantic_kernel/agents/runtime/core/telemetry/tracing_config.py | Uses standard-library NotRequired. |
| python/semantic_kernel/agents/runtime/core/routed_agent.py | Checks handler return types against Any directly. |
| python/semantic_kernel/agents/runtime/core/base_agent.py | Uses standard-library Self. |
| python/semantic_kernel/agents/runtime/core/agent_id.py | Removes the Self backport guard. |
| python/semantic_kernel/agents/orchestration/handoffs.py | Uses standard-library Self. |
| python/semantic_kernel/agents/open_ai/azure_responses_agent.py | Removes the Self backport guard. |
| python/semantic_kernel/agents/open_ai/azure_assistant_agent.py | Removes the Self backport guard. |
| python/samples/learn_resources/README.md | Raises the documented Python minimum. |
| python/samples/getting_started_with_agents/copilot_studio/README.md | Raises the documented Python minimum. |
| python/samples/demos/mcp_with_oauth/server/uv.lock | Removes Python 3.10-only dependencies and artifacts. |
| python/samples/demos/mcp_with_oauth/server/pyproject.toml | Requires Python 3.11+. |
| python/samples/demos/mcp_with_oauth/pyproject.toml | Raises the minimum and Ruff target to 3.11. |
| python/samples/demos/guided_conversations/pyproject.toml | Raises the minimum while retaining the upper bound. |
| python/samples/demos/booking_restaurant/README.md | Updates documented Python versions. |
| python/README.md | Updates supported Python versions. |
| python/pyproject.toml | Raises the minimum, updates classifiers, and simplifies ONNX pins. |
| python/Makefile | Defaults to 3.14 and installs Python 3.11–3.15. |
| python/DEV_SETUP.md | Aligns setup instructions with the new defaults. |
| python/.vscode/tasks.json | Updates interpreter choices and the default. |
| python/.pre-commit-config.yaml | Targets Python 3.11+ for pyupgrade. |
| .github/workflows/python-unit-tests.yml | Expands required version coverage and provisions interpreters. |
| .github/workflows/python-test-coverage.yml | Moves coverage to Python 3.11. |
| .github/workflows/python-lint.yml | Moves linting to Python 3.11. |
| .github/workflows/python-integration-tests.yml | Uses Python 3.14 with explicit interpreter setup. |
| .github/workflows/python-build.yml | Moves builds to Python 3.11. |
Review effort: Balanced
Preserve upstream dependency updates while regenerating locks without Python 3.10 support. Exclude the new Chroma-dependent filter tests only on Python 3.15.
Jose Alvarez (jpalvarezl)
left a comment
There was a problem hiding this comment.
One Python 3.14 compatibility issue remains in the all-extras setup paths.
Jose Alvarez (jpalvarezl)
left a comment
There was a problem hiding this comment.
The Python 3.14 AutoGen/NumPy compatibility gap is addressed. The dependency marker, per-environment setup, test collection policy, lockfile, and published wheel metadata are consistent across the supported combinations.

Motivation and Context
Retire Python 3.10 support and its compatibility code. Align the SDK's supported versions, CI coverage, and developer setup with Python 3.11 through 3.14. Use Python 3.14 as the local development and integration-test default.
This intentionally raises the minimum supported Python version from 3.10 to 3.11. Python 3.14 is the highest supported and tested version. Keep the existing minimum-only
requires-python = ">=3.11"policy; do not add an installation upper bound.Description
SelfandNotRequiredbackports with standard-library imports. Remove the Python 3.10AnyTypeshim, obsolete test skips, and the event-loop workaround. Apply Python 3.11 syntax upgrades, including built-inTimeoutErroranddatetime.UTC. Keep import guards still needed by Python 3.11.uv pip installresolution in unit CI, integration CI, and local setup, including the development dependency group. Useuv run --no-syncfor subsequent tools and VS Code tasks so the shared universal lock does not restore incompatible NumPy 1.x. MCP sample subprocesses also use--no-sync.azure-ai-projectsto>=1.0,<2.0: SK's Azure AI agent implementation requires the classic APIs removed in Projects 2.x. Add a regression test that checks the actual installed client's agent, file, thread, and run operations without cloud calls.nest-asynciodependency and imports withnest-asyncio2>=1.7.4,<2. The old patch breaks Python 3.14 task detection, causing OpenAI/sniffio, AnyIO/MCP, and notebook timeout failures. Update nested-loop MCP samples too. Add regression tests for nested template invocation, async-library detection, timeout handling, and restoration of the outer task context.Anyreturn annotations in message and RPC handlers.Validation
From
python/, using an isolated stable Python 3.14.9 environment withVIRTUAL_ENV/UV_PROJECT_ENVIRONMENTpointing to its session-only directory:uv pip install --editable . --requirements pyproject.toml --all-extras --group dev --upgrade --prerelease=if-necessary-or-explicit— passed; installed Azure Projects 1.0.0, nest-asyncio2 1.7.4, and the full supported extras/dev dependency set.uv run --no-sync pytest tests/unit --ignore=tests/unit/processes/dapr_runtime --disable-warnings -o addopts=-ra -q— passed: 4,947 passed, 1 skipped, 5 xfailed.uv run --no-sync pytest tests/unit/prompt_template tests/unit/agents/azure_ai_agent --disable-warnings -o addopts=-ra -q— passed before the stable-interpreter recheck: 328 tests. The full stable-interpreter run above includes these tests.From the repository root unless noted:
cd python && .venv/bin/pytest tests/unit/prompt_template tests/unit/agents/azure_ai_agent --disable-warnings -o addopts=-ra -q— passed on Python 3.11: 328 tests.python/.venv/bin/pre-commit run --all-files --config python/.pre-commit-config.yaml— passed, including pyupgrade, Ruff, formatting, lockfile consistency, and Bandit.uv build --project python --out-dir "$BUILD_OUTPUT"— passed, withBUILD_OUTPUTset to the session-only artifact directory; built the source distribution and wheel. uv reports the existingif-necessary-or-explicitdeprecation warning.git diff --check— passed.Also exercised the failing async paths on stable Python 3.14.9 after nested template rendering: an actual Azure OpenAI SDK request with an in-memory HTTP mock, stdio initialization/tool listing for both MCP sample servers, and execution of a Python 3.14 notebook cell using
asyncio.timeout. All passed without cloud calls. The old nest-asyncio failure was independently reproduced without external services.Verified the support matrix, metadata, AutoGen marker/collection policy on all 12 OS/Python combinations, all six integration installers/runners, and preservation of existing locked package versions and registry/artifact URLs. Windows and Linux Python 3.14 installation resolution checks select NumPy/SciPy wheels without AutoGen. Previously verified rejection of Python 3.10 during wheel installation.
Live service integration tests were not run locally. Regular PR checks skip those jobs for fork PRs; the merge queue must run them to establish the latest commit's live-service results. The latest fixes do not skip additional integration tests.
Contribution Checklist