[project] name = "agent-framework" description = "Microsoft Agent Framework for building AI Agents with Python." authors = [{ name = "Microsoft", email = "SK-Support@microsoft.com"}] readme = "README.md" requires-python = ">=3.10" version = "0.1.0b1" license = {file = "LICENSE"} urls.homepage = "https://learn.microsoft.com/en-us/semantic-kernel/overview/" 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", "Framework :: Pydantic :: 2", "Typing :: Typed", ] dependencies = [ "agent-framework-azure", "agent-framework-openai", "pydantic>=2.11.7", "typing-extensions>=4.14.0", ] [tool.uv] prerelease = "if-necessary-or-explicit" dev-dependencies = [ "pre-commit >= 3.7", "ruff>=0.11.8", "pytest>=8.4.1", "pytest-asyncio>=1.0.0", "pytest-cov>=6.2.1", "pytest-xdist[psutil]>=3.8.0", "pytest-timeout>=2.3.1", "mypy>=1.16.1", "pyright>=1.1.402", #tasks "poethepoet>=0.36.0", "rich", "tomli", "tomli-w", "markdownify", # Documentation "myst-nb==1.1.2", "pydata-sphinx-theme==0.16.0", "sphinx-copybutton", "sphinx-design", "sphinx", "sphinxcontrib-apidoc", "autodoc_pydantic~=2.2", "pygments", "sphinxext-rediraffe", "opentelemetry-instrumentation-openai", "markdown-it-py[linkify]", # Documentation tooling "diskcache", "redis", "sphinx-autobuild", ] environments = [ "sys_platform == 'darwin'", "sys_platform == 'linux'", "sys_platform == 'win32'" ] [tool.pytest.ini_options] testpaths = 'tests' addopts = "-ra -q -r fEX" asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" filterwarnings = [] timeout = 120 [tool.uv.workspace] members = ["extensions/*"] [tool.uv.sources] agent-framework-openai = { workspace = true } agent-framework-azure = { workspace = true } [tool.uv-dynamic-versioning] fallback-version = "0.0.0" [tool.ruff] line-length = 120 target-version = "py310" fix = true include = ["*.py", "*.pyi", "**/pyproject.toml", "*.ipynb"] exclude = ["docs/*", "run_tasks_in_extensions_if_exists.py", "check_md_code_blocks.py"] 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 "D418", # allow overload to have a docstring "TD003", # allow missing link to todo issue "FIX002" # allow todo ] [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"] "*.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.pyright] include = ["agent_framework", "samples"] typeCheckingMode = "strict" reportUnnecessaryIsInstance = false reportMissingTypeStubs = false [tool.mypy] plugins = ['pydantic.mypy'] strict = true python_version = "3.10" ignore_missing_imports = true disallow_untyped_defs = true no_implicit_optional = true check_untyped_defs = true warn_return_any = true show_error_codes = true warn_unused_ignores = false disallow_incomplete_defs = true disallow_untyped_decorators = true disallow_any_unimported = true [tool.bandit] targets = ["agent_framework"] exclude_dirs = ["tests", "./run_tasks_in_extensions_if_exists.py", "./check_md_code_blocks.py", "docs"] [tool.poe.tasks] markdown-code-lint = """python check_md_code_blocks.py ../README.md ./docs/agent-framework/**/*.md README.md""" samples-code-check = """pyright ./samples""" docs-clean = "rm -rf docs/build" docs-build = "sphinx-build docs/agent-framework docs/build" docs-serve = "sphinx-autobuild --watch src docs/agent-framework docs/build --port 8000 --jobs auto" docs-check = "sphinx-build --fail-on-warning docs/agent-framework docs/build" docs-check-examples = "sphinx-build -b code_lint docs/agent-framework docs/build" pre-commit-install = "uv run pre-commit install --install-hooks --overwrite" install = "uv sync --all-extras --dev -U --prerelease=if-necessary-or-explicit" format.ref = "fmt" check = ["fmt", "lint", "pyright", "mypy", "test", "markdown-code-lint", "samples-code-check"] pre-commit-check = ["fmt", "lint", "pyright", "test", "markdown-code-lint", "samples-code-check"] [tool.poe.tasks.fmt] sequence = [ { cmd = "python run_tasks_in_extensions_if_exists.py fmt"}, { cmd = "ruff format agent_framework tests samples" } ] [tool.poe.tasks.lint] sequence = [ { cmd = "python run_tasks_in_extensions_if_exists.py lint" }, { cmd = "ruff check --fix --exit-non-zero-on-fix agent_framework tests samples" } ] [tool.poe.tasks.pyright] sequence = [ { cmd = "python run_tasks_in_extensions_if_exists.py pyright" }, { cmd = "pyright" } ] [tool.poe.tasks.mypy] sequence = [ { cmd = "python run_tasks_in_extensions_if_exists.py mypy" }, { cmd = "mypy --config-file pyproject.toml agent_framework" } ] [tool.poe.tasks.test] sequence = [ { cmd = "python run_tasks_in_extensions_if_exists.py test" }, { cmd = "pytest --cov=agent_framework --cov-report=term-missing:skip-covered tests/unit/" } ] [tool.poe.tasks.build] sequence = [ { cmd = "python run_tasks_in_extensions_if_exists.py build" }, { cmd = "uv build" } ] [tool.poe.tasks.venv] cmd = "uv venv --python $python" args = [{ name = "python", default = "3.13", options = ['-p', '--python'] }] [tool.poe.tasks.setup] sequence = [ { ref = "venv --python $python"}, { ref = "install" }, { ref = "pre-commit-install" } ] args = [{ name = "python", default = "3.13", options = ['-p', '--python'] }] [tool.uv.build-backend] module-name = "agent_framework" module-root = "" [build-system] requires = ["uv_build>=0.7.19,<0.8.0"] build-backend = "uv_build"