[build-system] build-backend = "flit_core.buildapi" # Build system specify which backend is used to build/install the project (flit, # poetry, setuptools,...). All backends are supported by `pip install` requires = [ "flit-core>=3.8,<4" ] [project] # Project metadata. Available keys are documented at: # https://packaging.python.org/en/latest/specifications/declaring-project-metadata name = "google-adk" description = "Agent Development Kit" readme = "README.md" license = { file = "LICENSE" } authors = [ { name = "Google LLC", email = "googleapis-packages@google.com" } ] requires-python = ">=3.10" classifiers = [ "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", "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", "Topic :: Software Development :: Libraries :: Python Modules", # List of https://pypi.org/classifiers/ "Typing :: Typed", ] dynamic = [ "version" ] dependencies = [ "aiosqlite>=0.21", "authlib>=1.6.6,<2", "click>=8.1.8,<9", "fastapi>=0.133,<1", "google-auth[pyopenssl]>=2.47", "google-genai>=2.9,<3", "graphviz>=0.20.2,<1", "httpx>=0.27,<1", "jsonschema>=4.23,<5", "opentelemetry-api>=1.39,<=1.42.1", "opentelemetry-sdk>=1.39,<=1.42.1", "packaging>=21", "pydantic>=2.12,<3", "python-dotenv>=1,<2", "python-multipart>=0.0.9,<1", "pyyaml>=6.0.2,<7", "requests>=2.32.4,<3", "starlette>=1.0.1,<2", "tenacity>=9,<10", "typing-extensions>=4.5,<5", "tzlocal>=5.3,<6", "uvicorn>=0.34,<1", "watchdog>=6,<7", "websockets>=15.0.1,<16", ] optional-dependencies.a2a = [ "a2a-sdk>=0.3.4,<2", ] optional-dependencies.agent-identity = [ "google-cloud-agentidentitycredentials>=0.1,<0.2", "google-cloud-iamconnectorcredentials>=0.1,<0.2", ] optional-dependencies.all = [ "anyio>=4.9,<5", "daytona>=0.191", "e2b>=2,<3", "google-api-python-client>=2.157,<3", "google-cloud-aiplatform[agent-engines]>=1.148.1,<2", "google-cloud-bigquery>=2.2", "google-cloud-bigquery-storage>=2", "google-cloud-bigtable>=2.39.1", "google-cloud-dataplex>=1.7,<3", "google-cloud-discoveryengine>=0.13.12,<0.14", "google-cloud-parametermanager>=0.4,<1", "google-cloud-pubsub>=2,<3", "google-cloud-resource-manager>=1.12,<2", "google-cloud-secret-manager>=2.22,<3", "google-cloud-spanner>=3.56,<4", "google-cloud-speech>=2.30,<3", "google-cloud-storage>=2.18,<4", "mcp>=1.24,<2", "opentelemetry-exporter-gcp-logging>=1.9.0a0,<=1.12.0a0", "opentelemetry-exporter-gcp-monitoring>=1.9.0a0,<2", "opentelemetry-exporter-gcp-trace>=1.9,<2", "opentelemetry-exporter-otlp-proto-http>=1.36", "opentelemetry-resourcedetector-gcp>=1.9.0a0,<2", "pyarrow>=14", "python-dateutil>=2.9.0.post0,<3", "sqlalchemy>=2,<3", "sqlalchemy-spanner>=1.14", ] optional-dependencies.antigravity = [ "google-antigravity>=0.1,<0.2", "protobuf>=6", ] optional-dependencies.benchmark = [ "google-benchmark>=1.9", ] optional-dependencies.community = [ "google-adk-community", ] optional-dependencies.daytona = [ "daytona>=0.191", # For DaytonaEnvironment remote sandbox. ] optional-dependencies.db = [ "sqlalchemy>=2,<3", "sqlalchemy-spanner>=1.14", ] optional-dependencies.dev = [ "flit>=3.10", # Lint tools used by scripts/run_precommit_checks.sh (which runs them directly, # without the pre-commit framework). Formatters that rewrite files are pinned # to the exact versions in .pre-commit-config.yaml so local runs produce # byte-identical output to CI. "isort==8.0.1", "mdformat==0.7.22", "mdformat-gfm", "mypy>=1.15", "pre-commit>=4", "pre-commit-hooks==4.6", "pyink==25.12", "pylint>=2.6", "pyproject-fmt==2.24", "ruff==0.15.17", "tox>=4.23.2", "tox-uv>=1.33.2", ] optional-dependencies.docs = [ "autodoc-pydantic", "furo", "myst-parser", "sphinx<9", "sphinx-autodoc-typehints", "sphinx-click", "sphinx-rtd-theme", ] optional-dependencies.e2b = [ "e2b>=2,<3", # For E2BEnvironment remote sandbox. ] optional-dependencies.eval = [ "gepa>=0.1", "google-cloud-aiplatform[evaluation]>=1.148", "jinja2>=3.1.4,<4", # For eval template rendering "pandas>=2.2.3", "rouge-score>=0.1.2", "tabulate>=0.9", ] optional-dependencies.extensions = [ "anthropic>=0.78", # For anthropic model support; 0.78 introduced ThinkingConfigAdaptiveParam (required for Claude Opus 4.7). "beautifulsoup4>=3.2.2", # For load_web_page tool. "crewai[tools]; python_version>='3.11' and python_version<'3.12'", # For CrewaiTool; chromadb/pypika fail on 3.12+ "docker>=7", # For ContainerCodeExecutor "google-cloud-firestore>=2.11,<3", # For Firestore services "k8s-agent-sandbox>=0.1.1.post3", "kubernetes>=29", "langgraph>=0.2.60,<0.4.8", "litellm>=1.84", "llama-index-embeddings-google-genai>=0.3", "llama-index-readers-file>=0.4", "lxml>=5.3", "openai>=2.20,<3", "pypika>=0.50", "toolbox-adk>=1,<2", ] optional-dependencies.gcp = [ "google-cloud-aiplatform[agent-engines]>=1.148.1,<2", "google-cloud-bigquery>=2.2", "google-cloud-bigquery-storage>=2", "google-cloud-bigtable>=2.39.1", "google-cloud-dataplex>=1.7,<3", "google-cloud-discoveryengine>=0.13.12,<0.14", "google-cloud-parametermanager>=0.4,<1", "google-cloud-pubsub>=2,<3", "google-cloud-resource-manager>=1.12,<2", "google-cloud-secret-manager>=2.22,<3", "google-cloud-spanner>=3.56,<4", "google-cloud-speech>=2.30,<3", "google-cloud-storage>=2.18,<4", "opentelemetry-exporter-gcp-logging>=1.9.0a0,<=1.12.0a0", "opentelemetry-exporter-gcp-monitoring>=1.9.0a0,<2", "opentelemetry-exporter-gcp-trace>=1.9,<2", "opentelemetry-exporter-otlp-proto-http>=1.36", "opentelemetry-resourcedetector-gcp>=1.9.0a0,<2", "pyarrow>=14", "python-dateutil>=2.9.0.post0,<3", ] optional-dependencies.mcp = [ "anyio>=4.9,<5", "mcp>=1.24,<2", ] optional-dependencies.otel-gcp = [ "opentelemetry-instrumentation-google-genai>=0.7b1,<1", "opentelemetry-instrumentation-grpc>=0.43b0,<1", "opentelemetry-instrumentation-httpx>=0.54b0,<1", ] optional-dependencies.slack = [ "slack-bolt>=1.22" ] optional-dependencies.test = [ "a2a-sdk>=0.3.4,<2", "anthropic>=0.78", # For anthropic model tests; 0.78 introduced ThinkingConfigAdaptiveParam (required for Claude Opus 4.7). "anyio>=4.9,<5", "beautifulsoup4>=3.2.2", "crewai[tools]; python_version>='3.11' and python_version<'3.12'", # For CrewaiTool tests; chromadb/pypika fail on 3.12+ "daytona>=0.191", "docker>=7", # For ContainerCodeExecutor tests "e2b>=2,<3", "gepa>=0.1", "google-antigravity>=0.1,<0.2", "google-api-python-client>=2.157,<3", "google-cloud-agentidentitycredentials>=0.1,<0.2", "google-cloud-aiplatform[agent-engines,evaluation]>=1.148.1,<2", "google-cloud-bigquery>=2.2", "google-cloud-bigquery-storage>=2", "google-cloud-bigtable>=2.39.1", "google-cloud-dataplex>=1.7,<3", "google-cloud-discoveryengine>=0.13.12,<0.14", "google-cloud-firestore>=2.11,<3", "google-cloud-iamconnectorcredentials>=0.1,<0.2", "google-cloud-parametermanager>=0.4,<1", "google-cloud-pubsub>=2,<3", "google-cloud-resource-manager>=1.12,<2", "google-cloud-secret-manager>=2.22,<3", "google-cloud-spanner>=3.56,<4", "google-cloud-speech>=2.30,<3", "google-cloud-storage>=2.18,<4", "jinja2>=3.1.4,<4", "kubernetes>=29", "langchain-community>=0.3.17", "langgraph>=0.2.60,<0.4.8", "litellm>=1.84", "llama-index-readers-file>=0.4", "lxml>=5.3", "mcp>=1.24,<2", "openai>=2.20,<3", "opentelemetry-exporter-gcp-logging>=1.9.0a0,<=1.12.0a0", "opentelemetry-exporter-gcp-monitoring>=1.9.0a0,<2", "opentelemetry-exporter-gcp-trace>=1.9,<2", "opentelemetry-exporter-otlp-proto-http>=1.36", "opentelemetry-instrumentation-google-genai>=0.7b1,<1", "opentelemetry-resourcedetector-gcp>=1.9.0a0,<2", "pandas>=2.2.3", "protobuf>=6", "pyarrow>=14", "pypika>=0.50", "pytest>=9,<10", "pytest-asyncio>=0.25", "pytest-mock>=3.14", "pytest-xdist>=3.6.1", "python-dateutil>=2.9.0.post0,<3", "python-multipart>=0.0.9", "rouge-score>=0.1.2", "slack-bolt>=1.22", "sqlalchemy>=2,<3", "sqlalchemy-spanner>=1.14", "tabulate>=0.9", "tomli>=2,<3; python_version<'3.11'", ] optional-dependencies.toolbox = [ "toolbox-adk>=1,<2" ] optional-dependencies.tools = [ "google-api-python-client>=2.157,<3", ] urls.changelog = "https://github.com/google/adk-python/blob/main/CHANGELOG.md" urls.documentation = "https://google.github.io/adk-docs/" urls.homepage = "https://google.github.io/adk-docs/" urls.repository = "https://github.com/google/adk-python" scripts.adk = "google.adk.cli:main" [tool.flit] module.name = "google.adk" module.include = [ "py.typed" ] sdist.include = [ "src/**/*", "README.md", "pyproject.toml", "LICENSE" ] sdist.exclude = [ "src/**/*.sh", "src/**/README.md" ] [tool.ruff] extend-exclude = [ "src/google/adk/cli/browser/", # These hardcode googleapis.com endpoints and trip the check-file-contents # mTLS policy check the moment they change. Excluded so unused-import # cleanup does not pull them into a PR; clean them up when the mTLS policy # is addressed. "src/google/adk/integrations/bigquery/bigquery_credentials.py", "src/google/adk/integrations/bigquery/data_insights_tool.py", "src/google/adk/plugins/bigquery_agent_analytics_plugin.py", "src/google/adk/tools/data_agent/data_agent_tool.py", ] lint.select = [ "F401" ] # __init__.py files re-export symbols for the public API; unused imports # there are intentional, not dead code. lint.per-file-ignores."**/__init__.py" = [ "F401" ] [tool.isort] profile = "google" line_length = 200 single_line_exclusions = [] known_third_party = [ "a2a", "google.adk" ] [tool.mypy] mypy_path = [ "src" ] exclude = [ "contributing/samples/", "tests/" ] namespace_packages = true explicit_package_bases = true follow_imports = "normal" python_version = "3.11" disable_error_code = [ "import-not-found", "import-untyped", "unused-ignore" ] strict = true plugins = [ "pydantic.mypy" ] overrides = [ { module = [ "google.auth.*", ], ignore_missing_imports = true, follow_imports = "skip" } ] [tool.pytest] ini_options.testpaths = [ "tests" ] ini_options.asyncio_default_fixture_loop_scope = "function" ini_options.asyncio_mode = "auto" [tool.pyink] line-length = 80 unstable = true pyink-indentation = 2 pyink-use-majority-quotes = true pyink-annotation-pragmas = [ "noqa", "pylint:", "type: ignore", "pytype:", "mypy:", "pyright:", "pyre-", ]