Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/actions/python-setup/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ runs:
sed -i.bak '/\[tool\.uv\.workspace\]/a\exclude = ["'"$pkg_dir"'"]' python/pyproject.toml
fi
sed -i.bak '/'"$pkg"' = { workspace = true }/d' python/pyproject.toml
sed -i.bak '/"'"$pkg"'\([<>=;]\|"\)/d' python/packages/core/pyproject.toml
fi
done
done
Expand Down
82 changes: 79 additions & 3 deletions .github/workflows/python-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@ jobs:
python-tests:
name: Python Tests
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.python-version == '3.15' }}
strategy:
fail-fast: true
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15"]
# todo: add macos-latest when problems are resolved
os: [ubuntu-latest, windows-latest]
# Other native dependencies still take several minutes to build for 3.15 on Windows.
# Full workspace setup still builds excluded native packages slowly on 3.15.
# The dedicated meta-package job below covers the reported Windows 3.14 install path.
exclude:
- python-version: "3.15"
os: windows-latest
Expand All @@ -45,7 +45,7 @@ jobs:
python-version: ${{ matrix.python-version }}
os: ${{ runner.os }}
# DuckDB has no Python 3.15 wheels yet; source builds dominate setup time.
exclude-packages: ${{ matrix.python-version == '3.10' && 'agent-framework-github-copilot agent-framework-azure-cosmos-memory' || matrix.python-version == '3.15' && 'agent-framework-sql-server agent-framework-duckdb' || '' }}
exclude-packages: ${{ matrix.python-version == '3.10' && 'agent-framework-github-copilot agent-framework-azure-cosmos-memory' || matrix.python-version == '3.15' && 'agent-framework-sql-server agent-framework-duckdb agent-framework-redis' || '' }}
env:
# Configure a constant location for the uv cache
UV_CACHE_DIR: /tmp/.uv-cache
Expand All @@ -64,3 +64,79 @@ jobs:
display-options: fEX
fail-on-empty: false
title: Test results

python-meta-package-install:
name: Python Meta Install (${{ matrix.python-version }}, Windows)
runs-on: windows-latest
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
python-version: ["3.14"]
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Set up uv
uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
with:
version-file: "python/pyproject.toml"
enable-cache: true
cache-suffix: windows-meta-${{ matrix.python-version }}
- name: Create the Python environment
shell: pwsh
run: |
uv venv --python "${{ matrix.python-version }}" --seed .meta-venv
& ".meta-venv\Scripts\python.exe" --version
- name: Build release wheelhouse
shell: bash
run: |
set -euo pipefail
mkdir -p wheelhouse
uv build \
--directory python \
--all-packages \
--wheel \
--no-build-logs \
--no-create-gitignore \
--out-dir "${{ github.workspace }}/wheelhouse"
uv build \
--directory python \
--wheel \
--no-build-logs \
--no-create-gitignore \
--out-dir "${{ github.workspace }}/wheelhouse"
- name: Resolve the end-user install
timeout-minutes: 6
shell: pwsh
env:
PIP_DISABLE_PIP_VERSION_CHECK: "1"
run: |
$python = ".meta-venv\Scripts\python.exe"
& $python -m pip install --upgrade pip
$version = & $python -c "import tomllib; print(tomllib.load(open('python/pyproject.toml', 'rb'))['project']['version'])"
$stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
& $python -m pip install `
--dry-run `
--ignore-installed `
--find-links wheelhouse `
--report "pip-resolution-${{ matrix.python-version }}.json" `
"agent-framework==$version" `
azure-identity
if ($LASTEXITCODE -ne 0) {
exit $LASTEXITCODE
}
$stopwatch.Stop()
$seconds = [math]::Round($stopwatch.Elapsed.TotalSeconds, 2)
"Pip resolution completed in $seconds seconds." | Tee-Object -FilePath $env:GITHUB_STEP_SUMMARY -Append
if ($stopwatch.Elapsed.TotalSeconds -gt 180) {
throw "Pip dependency resolution exceeded the 180-second budget."
}
- name: Install and import the meta package
timeout-minutes: 10
shell: pwsh
env:
PIP_DISABLE_PIP_VERSION_CHECK: "1"
run: |
$python = ".meta-venv\Scripts\python.exe"
$version = & $python -c "import tomllib; print(tomllib.load(open('python/pyproject.toml', 'rb'))['project']['version'])"
& $python -m pip install --find-links wheelhouse "agent-framework==$version" azure-identity
& $python -c "import agent_framework; import azure.identity"
14 changes: 14 additions & 0 deletions python/.github/skills/agent-framework-py-release/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,20 @@ If the user opts into a cohort-wide beta bump regardless of per-package changes,

Spot-check with `grep '^version' python/pyproject.toml python/packages/*/pyproject.toml | sort` before moving on.

### 5a. Refresh the `core[all]` release cohort

When Core bumps, update every Agent Framework dependency in
`python/packages/core/pyproject.toml` `[project.optional-dependencies].all`:

- Workspace packages use their post-bump version as the lower bound, or their unchanged current version when they
are not otherwise releasing this cycle.
- External Agent Framework packages such as Azure Functions and Durable Task retain a bounded known-good floor.
- Every entry keeps an upper bound for its supported major version.
- Preserve environment markers for packages that do not support every Python/platform combination.

These bounds prevent pip from backtracking across old cyclic `core[all] -> integration -> core` combinations. The
release validator rejects missing, stale, or unbounded cohort entries.

### 6. Floor bound updates on `agent-framework-core`

Only relevant when `core` itself bumped this cycle. Two policies, pick one explicitly with the user:
Expand Down
7 changes: 7 additions & 0 deletions python/.github/skills/python-package-management/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ python/
- `agent-framework-core` contains core abstractions and OpenAI/Azure OpenAI built-in
- Provider packages extend core with specific integrations
- Root `agent-framework` depends on `agent-framework-core[all]`
- Entries in `agent-framework-core[all]` carry lower and upper bounds. Workspace integrations use the version
released with the current Core cohort as their lower bound so pip does not backtrack across old cyclic
`core[all] -> integration -> core` combinations.
- `packages/lab` is intentionally excluded from the root uv workspace. It has its own
`pyproject.toml`, `uv.lock`, environment, CI matrix, and dependency updates so experimental
dependencies cannot constrain released provider packages. Lab is also an explicit exception
Expand Down Expand Up @@ -247,6 +250,10 @@ Move a package to `released` when it no longer carries a prerelease qualifier.
- If package B is promoted to a different lifecycle stage, update package A's dependency
declaration to the new versioning scheme for package B even when the only change is the stage
transition itself.
- When Core releases, advance each workspace package floor in `agent-framework-core[all]` to that package's
co-released version, including unchanged packages at their existing version. Keep an upper bound appropriate
for the package's current major version. This release-cohort metadata is independent of whether the package
itself needed a version bump.
- Use this guidance both for ordinary version updates and for package promotion work.

- All non-core packages declare a lower bound on `agent-framework-core`
Expand Down
Loading
Loading