Files
microsoft--agent-framework/python/pyproject.toml
T
Evan Mattson 7464a59228 Python: Bump Python package versions for 1.11.0 release (#7035)
* Bump Python package versions for 1.11.0 release

Bump the CHANGELOG-selected packages for the 1.11.0 release: core and the root package move to 1.11.0 for the new stable APIs, Foundry and OpenAI receive patch bumps, changed prerelease packages receive the 260709 stamp or next RC counter, and Monty joins the bump set for corrected published dependency metadata. No beta cohort bump was applied. Raise core floors conservatively on every package publishing this cycle and correct dependency floors exposed by lower-bound validation.

Copilot-Session: ee33d338-c1fc-4182-9106-0345ccf26b8e

* Fix Gemini streaming type suppression

Move the targeted Pyright suppression to the SDK contents argument, where the google-genai invariant content-list alias produces the compatibility diagnostic, and remove the now-unnecessary member suppression.

Copilot-Session: ee33d338-c1fc-4182-9106-0345ccf26b8e

* Raise Monty core dependency floor

Align Monty with the conservative release policy by requiring agent-framework-core 1.11.0 or later for the package version published in this cycle.

Copilot-Session: ee33d338-c1fc-4182-9106-0345ccf26b8e
2026-07-10 12:15:26 +09:00

442 lines
16 KiB
TOML

[project]
name = "agent-framework"
description = "Microsoft Agent Framework for building AI Agents with Python. This package contains all the core and optional packages."
authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}]
readme = "README.md"
requires-python = ">=3.10"
version = "1.11.0"
license-files = ["LICENSE"]
urls.homepage = "https://aka.ms/agent-framework"
urls.source = "https://github.com/microsoft/agent-framework/tree/main/python"
urls.release_notes = "https://github.com/microsoft/agent-framework/releases?q=tag%3Apython-1&expanded=true"
urls.issues = "https://github.com/microsoft/agent-framework/issues"
classifiers = [
"License :: OSI Approved :: MIT License",
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Typing :: Typed",
]
dependencies = [
"agent-framework-core[all]==1.11.0",
]
[dependency-groups]
dev = [
"uv==0.11.28",
"flit==3.12.0",
"ruff==0.15.20",
"pytest==9.1.1",
"pytest-asyncio==1.4.0",
"pytest-cov==7.1.0",
"pytest-xdist[psutil]==3.8.0",
"pytest-timeout==2.4.0",
"pytest-retry==1.7.0",
"mypy==2.2.0",
"pyright==1.1.411",
"pyrefly==1.1.1",
"ty==0.0.55",
"zuban==0.8.2",
"mcp[ws]==1.28.1",
"opentelemetry-sdk==1.43.0",
"azure-monitor-opentelemetry==1.8.9",
#tasks
"poethepoet==0.48.0",
"rich>=13.7.1,<16.0.0",
"tomli==2.4.1",
"prek==0.4.5",
]
[tool.uv]
package = false
prerelease = "if-necessary-or-explicit"
# Security floors for transitive deps; overrides bypass litellm[proxy]'s strict pins.
constraint-dependencies = ["litellm>=1.83.7", "fastapi-sso>=0.19.0"]
# Allow opentelemetry-semantic-conventions 0.61b0 for mistralai compatibility
# (mistralai pins <0.61 but 0.61b0 is compatible at runtime).
# python-multipart>=0.0.31 overrides litellm[proxy]'s exact pin of <=0.0.27 for security.
override-dependencies = ["mcp[ws]>=1.27.0", "uvicorn[standard]>=0.34.0", "opentelemetry-semantic-conventions>=0.60b1", "python-multipart>=0.0.31"]
environments = [
"sys_platform == 'darwin'",
"sys_platform == 'linux'",
"sys_platform == 'win32'"
]
[tool.uv.workspace]
members = [ "packages/*" ]
[tool.uv.sources]
agent-framework = { workspace = true }
agent-framework-core = { workspace = true }
agent-framework-a2a = { workspace = true }
agent-framework-ag-ui = { workspace = true }
agent-framework-azure-ai-search = { workspace = true }
agent-framework-azure-cosmos = { workspace = true }
agent-framework-anthropic = { workspace = true }
agent-framework-azurefunctions = { workspace = true }
agent-framework-bedrock = { workspace = true }
agent-framework-chatkit = { workspace = true }
agent-framework-claude = { workspace = true }
agent-framework-copilotstudio = { workspace = true }
agent-framework-declarative = { workspace = true }
agent-framework-devui = { workspace = true }
agent-framework-durabletask = { workspace = true }
agent-framework-foundry = { workspace = true }
agent-framework-foundry-hosting = { workspace = true }
agent-framework-foundry-local = { workspace = true }
agent-framework-gemini = { workspace = true }
agent-framework-github-copilot = { workspace = true }
agent-framework-hosting = { workspace = true }
agent-framework-hosting-responses = { workspace = true }
agent-framework-hyperlight = { workspace = true }
agent-framework-lab = { workspace = true }
agent-framework-mem0 = { workspace = true }
agent-framework-mistral = { workspace = true }
agent-framework-monty = { workspace = true }
agent-framework-ollama = { workspace = true }
agent-framework-openai = { workspace = true }
agent-framework-orchestrations = { workspace = true }
agent-framework-purview = { workspace = true }
agent-framework-redis = { workspace = true }
agent-framework-azure-contentunderstanding = { workspace = true }
agent-framework-tools = { workspace = true }
[tool.ruff]
line-length = 120
target-version = "py310"
fix = true
include = ["*.py", "*.pyi", "**/pyproject.toml", "*.ipynb"]
exclude = ["scripts"]
extend-exclude = [
"[{][{]cookiecutter.package_name[}][}]",
]
preview = true
[tool.ruff.lint]
fixable = ["ALL"]
unfixable = []
select = [
"ASYNC", # async checks
"B", # bugbear checks
"CPY", # copyright
"D", # pydocstyle checks
"E", # pycodestyle error checks
"ERA", # remove connected out code
"F", # pyflakes checks
"FIX", # fixme checks
"I", # isort
"INP", # implicit namespace package
"ISC", # implicit string concat
"Q", # flake8-quotes checks
"RET", # flake8-return check
"RSE", # raise exception parantheses check
"RUF", # RUF specific rules
"SIM", # flake8-simplify check
"T20", # typing checks
"TD", # todos
"W", # pycodestyle warning checks
"T100", # Debugger,
"S", # Bandit checks
]
ignore = [
"D100", # allow missing docstring in public module
"D104", # allow missing docstring in public package
"D421", # allow property docstrings that start with a verb
"D418", # allow overload to have a docstring
"TD003", # allow missing link to todo issue
"FIX002", # allow todo
"ASYNC119", # allow yielding inside async-generator context managers
"B027", # allow empty non-abstract method in ABC
"B905", # `zip()` without an explicit `strict=` parameter
"RUF067", # allow version detection in __init__.py
]
[tool.ruff.lint.per-file-ignores]
# Ignore all directories named `tests` and `samples`.
"**/tests/**" = ["D", "INP", "TD", "ERA001", "RUF", "S"]
"samples/**" = ["D", "INP", "ERA001", "RUF", "S", "T201", "CPY"]
"*.ipynb" = ["CPY", "E501"]
[tool.ruff.format]
docstring-code-format = true
[tool.ruff.lint.pydocstyle]
convention = "google"
[tool.ruff.lint.flake8-copyright]
notice-rgx = "^# Copyright \\(c\\) Microsoft\\. All rights reserved\\."
min-file-size = 1
[tool.pytest.ini_options]
testpaths = ['packages/**/tests', 'packages/**/ag_ui_tests']
norecursedirs = '**/lab/**'
addopts = "-ra -q -r fEX"
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
filterwarnings = []
timeout = 60
markers = [
"azure: marks tests as Azure provider specific",
"azure-ai: marks tests as Azure AI provider specific",
"openai: marks tests as OpenAI provider specific",
"integration: marks tests as integration tests that require external services",
]
[tool.coverage.run]
omit = [
"**/__init__.py"
]
[tool.pyright]
# Pyright is the sole SOURCE-code type checker. Tests + samples are covered by mypy,
# pyrefly, ty (and zuban) instead, so Pyright excludes them entirely -- no per-package
# test executionEnvironments are needed anymore.
exclude = ["**/tests/**", "**/ag_ui_tests/**", "samples/**", "**/.venv/**", "packages/devui/frontend/**"]
typeCheckingMode = "strict"
reportUnnecessaryIsInstance = false
reportMissingTypeStubs = false
reportUnnecessaryCast = "error"
# With MyPy off source, mypy-only ``# type: ignore`` comments are now dead weight. Flag
# them so they get removed and do not creep back in.
reportUnnecessaryTypeIgnoreComment = "error"
# MyPy (and zuban, which reads this [mypy]-compatible config) no longer run on source
# code -- Pyright is the sole source-code type checker. These checkers run over the
# tests + samples instead, in a deliberately relaxed mode: real type errors in how the
# public API is exercised are caught, but test/sample authors are not burdened with
# annotating every function. See docs/skills/python-code-quality.
[tool.mypy]
plugins = ['pydantic.mypy']
python_version = "3.10"
ignore_missing_imports = true
check_untyped_defs = true
disallow_untyped_defs = false
disallow_incomplete_defs = false
disallow_untyped_decorators = false
no_implicit_optional = true
warn_return_any = false
warn_unused_ignores = false
show_error_codes = true
# NumPy 2.5 stubs use Python 3.12 type-statement syntax while mypy intentionally
# targets Python 3.10 for test typing; skip parsing NumPy internals.
[[tool.mypy.overrides]]
module = ["numpy", "numpy.*"]
follow_imports = "skip"
follow_imports_for_stubs = true
# ty (preview) over tests + samples. Relaxed: ty's defaults are gradual, and a few
# categories are too noisy on test/mock-heavy code to gate on yet.
[tool.ty.rules]
unused-type-ignore-comment = "ignore"
[tool.bandit]
targets = ["agent_framework"]
exclude_dirs = ["tests", "scripts", "samples"]
[tool.poe]
executor.type = "uv"
# Workspace setup
[tool.poe.tasks.install]
help = "Install all workspace packages, extras, and dev dependencies from the lockfile."
cmd = "uv sync --all-packages --all-extras --dev --frozen --prerelease=if-necessary-or-explicit"
[tool.poe.tasks.setup]
help = "Create the workspace virtual environment for -P/--python, install dependencies, and install prek hooks."
sequence = [
{ ref = "venv --python $python"},
{ ref = "install" },
{ ref = "prek-install" }
]
args = [{ name = "python", default = "3.13", options = ['-P', '-p', '--python'] }]
[tool.poe.tasks.venv]
help = "Create or recreate the workspace virtual environment for -P/--python."
cmd = "uv venv --clear --python $python"
args = [{ name = "python", default = "3.13", options = ['-P', '-p', '--python'] }]
[tool.poe.tasks.prek-install]
help = "Install or refresh the prek git hooks."
cmd = "prek install --overwrite"
# Syntax, typing, and validation
[tool.poe.tasks.syntax]
help = "Run Ruff formatting and Ruff checks for -P/--package packages, or use -S/--samples; add -F/--format or -C/--check to narrow the mode."
cmd = "python scripts/workspace_poe_tasks.py syntax"
[tool.poe.tasks.fmt]
help = "DEPRECATED: Use `syntax --format` instead."
cmd = "python scripts/workspace_poe_tasks.py syntax --format"
[tool.poe.tasks.format]
help = "DEPRECATED: Use `syntax --format` instead."
cmd = "python scripts/workspace_poe_tasks.py syntax --format"
[tool.poe.tasks.lint]
help = "DEPRECATED: Use `syntax --check` instead."
cmd = "python scripts/workspace_poe_tasks.py syntax --check"
[tool.poe.tasks.samples-lint]
help = "DEPRECATED: Use `syntax --samples --check` instead."
cmd = "python scripts/workspace_poe_tasks.py syntax --samples --check"
[tool.poe.tasks.pyright]
help = "Run Pyright for -P/--package packages, use -A/--all for one aggregate sweep, or use -S/--samples for sample checks."
cmd = "python scripts/workspace_poe_tasks.py pyright"
[tool.poe.tasks.mypy]
help = "Run MyPy over -P/--package test suites (alias for `test-typing --checker mypy`)."
cmd = "python scripts/workspace_poe_tasks.py mypy"
[tool.poe.tasks.test-typing]
help = "Run the tests/samples type checkers (mypy, pyrefly, ty, zuban) for -P/--package, -A/--all, or -S/--samples. Narrow with `--checker NAME` (repeatable)."
cmd = "python scripts/workspace_poe_tasks.py test-typing"
[tool.poe.tasks.typing]
help = "Run Pyright over source and the tests/samples checkers for -P/--package packages, or use -A/--all."
cmd = "python scripts/workspace_poe_tasks.py typing"
[tool.poe.tasks.samples-syntax]
help = "DEPRECATED: Use `pyright --samples` instead."
cmd = "python scripts/workspace_poe_tasks.py pyright --samples"
[tool.poe.tasks.check-packages]
help = "Run `syntax` and `pyright` for -P/--package packages."
cmd = "python scripts/workspace_poe_tasks.py check-packages"
[tool.poe.tasks.check]
help = "Run package syntax, pyright, and tests for -P/--package packages; without -P also include sample checks and markdown code lint, or use -S/--samples for sample-only checks."
cmd = "python scripts/workspace_poe_tasks.py check"
[tool.poe.tasks.markdown-code-lint]
help = "Lint Python code blocks embedded in README and sample markdown files."
cmd = "uv run python scripts/check_md_code_blocks.py 'README.md' './packages/**/README.md' './samples/**/*.md' --exclude cookiecutter-agent-framework-lab --exclude tau2 --exclude 'packages/devui/frontend' --exclude context_providers/azure_ai_search"
# Testing
[tool.poe.tasks.test]
help = "Run tests for -P/--package packages, or use -A/--all for one aggregate sweep; add -C/--cov for coverage."
cmd = "python scripts/workspace_poe_tasks.py test"
[tool.poe.tasks.all-tests]
help = "DEPRECATED: Use `test --all` instead."
cmd = "python scripts/workspace_poe_tasks.py test --all"
[tool.poe.tasks.all-tests-cov]
help = "DEPRECATED: Use `test --all --cov` instead."
cmd = "python scripts/workspace_poe_tasks.py test --all --cov"
# Build and publishing
[tool.poe.tasks._clean-dist-packages]
cmd = "python scripts/workspace_poe_tasks.py clean-dist"
[tool.poe.tasks._clean-dist-meta]
cmd = "rm -rf dist"
[tool.poe.tasks.clean-dist]
help = "Remove generated dist artifacts for -P/--package packages and the root meta package."
sequence = [
{ ref = "_clean-dist-packages --package ${project}" },
{ ref = "_clean-dist-meta" },
]
args = [{ name = "project", default = "*", options = ["-P", "--package"] }]
[tool.poe.tasks._build-packages]
cmd = "python scripts/workspace_poe_tasks.py build"
[tool.poe.tasks._build-meta]
cmd = "python -m flit build"
[tool.poe.tasks.build]
help = "Build -P/--package packages and the root meta package."
sequence = [
{ ref = "_build-packages --package ${project}" },
{ ref = "_build-meta" },
]
args = [{ name = "project", default = "*", options = ["-P", "--package"] }]
[tool.poe.tasks.publish]
help = "Publish built distributions with uv."
cmd = "uv publish"
# Dependency maintenance
[tool.poe.tasks.upgrade-dev-dependency-pins]
help = "Repin the workspace dev dependency versions used in pyproject.toml."
cmd = "python -m scripts.dependencies.upgrade_dev_dependencies"
[tool.poe.tasks._upgrade-lockfile]
cmd = "uv lock --upgrade"
[tool.poe.tasks.upgrade-dev-dependencies]
help = "Repin dev dependencies, refresh uv.lock, reinstall, and rerun validation commands."
sequence = [
{ ref = "upgrade-dev-dependency-pins" },
{ ref = "_upgrade-lockfile" },
{ ref = "install" },
{ ref = "check" },
{ ref = "typing" },
]
[tool.poe.tasks.add-dependency-to-project]
help = "Add a dependency to a -P/--package workspace package selected by short name such as `core`."
cmd = "python -m scripts.dependencies.add_dependency_to_project --package ${project} --dependency ${dependency}"
args = [
{ name = "project", options = ["-P", "--package"] },
{ name = "dependency", options = ["-D", "-d", "--dependency"] },
]
[tool.poe.tasks.validate-dependency-bounds-test]
help = "Run workspace dependency-bound validation in test mode, optionally scoped with -P/--package short names such as `core`."
shell = "python -m scripts.dependencies.validate_dependency_bounds --mode test --package \"$project\""
args = [{ name = "project", default = "*", options = ["-P", "--package"] }]
[tool.poe.tasks.validate-dependency-bounds-project]
help = "Validate lower and upper dependency bounds for a -P/--package workspace package, optionally narrowed with -M/--mode and -D/--dependency."
shell = """
command=(python -m scripts.dependencies.validate_dependency_bounds --mode "${mode}" --package "${project}")
if [ -n "${dependency}" ]; then
command+=(--dependencies "${dependency}")
fi
"${command[@]}"
"""
interpreter = "bash"
args = [
{ name = "mode", default = "both", options = ["-M", "-m", "--mode"] },
{ name = "project", default = "*", options = ["-P", "--package"] },
{ name = "dependency", default = "", options = ["-D", "-d", "--dependency"] },
]
[tool.poe.tasks.add-dependency-and-validate-bounds]
help = "Add a dependency to a -P/--package workspace package selected by short name such as `core`, then validate its dependency bounds with -D/--dependency."
sequence = [
{ ref = "add-dependency-to-project --package ${project} --dependency ${dependency}" },
{ ref = "validate-dependency-bounds-project --mode both --package ${project} --dependency ${dependency}" },
]
args = [
{ name = "project", options = ["-P", "--package"] },
{ name = "dependency", options = ["-D", "-d", "--dependency"] },
]
[tool.setuptools.packages.find]
where = ["packages"]
include = ["agent_framework**"]
namespaces = true
[[tool.uv.index]]
name = "testpypi"
url = "https://test.pypi.org/simple/"
publish-url = "https://test.pypi.org/legacy/"
explicit = true
[tool.flit.module]
name = "agent_framework_meta"
[build-system]
requires = ["flit-core >= 3.11,<4.0"]
build-backend = "flit_core.buildapi"