content: [project]
  name = "semantic-kernel"
  description = "Semantic Kernel Python SDK"
  authors = [{ name = "Microsoft", email = "SK-Support@microsoft.com"}]
  readme = "README.md"
  # Version read from __version__ field in __init__.py by Flit
  dynamic = ["version"]
  requires-python = ">=3.10"
  license = {file = "LICENSE"}
  urls.homepage = "https://learn.microsoft.com/en-us/semantic-kernel/overview/"
  urls.source = "https://github.com/microsoft/semantic-kernel/tree/main/python"
  urls.release_notes = "https://github.com/microsoft/semantic-kernel/releases?q=tag%3Apython-1&expanded=true"
  urls.issues = "https://github.com/microsoft/semantic-kernel/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",
    "Framework :: Pydantic :: 2",
    "Typing :: Typed",
  ]
  dependencies = [
      # azure agents
      "azure-ai-projects >= 1.0.0b12",
      "azure-ai-agents >= 1.2.0b3",
      "aiohttp ~= 3.8",
      "cloudevents ~=1.0",
      "pydantic >=2.0,!=2.10.0,!=2.10.1,!=2.10.2,!=2.10.3,<2.12",
      "pydantic-settings ~= 2.0",
      "defusedxml ~= 0.7",
      # azure identity
      "azure-identity >= 1.13",
      # embeddings
      "numpy >= 1.25.0; python_version < '3.12'",
      "numpy >= 1.26.0; python_version >= '3.12'",
      # openai connector
      "openai >= 1.98.0",
      # openapi and swagger
      "openapi_core >= 0.18,<0.20",
      "websockets >= 13, < 16",
      "aiortc>=1.9.0",
      # OpenTelemetry
      "opentelemetry-api ~= 1.24",
      "opentelemetry-sdk ~= 1.24",
      "prance >= 23.6.21,< 25.4.9",
      # templating
      "pybars4 ~= 0.9",
      "jinja2 ~= 3.1",
      "nest-asyncio ~= 1.6",
      "scipy>=1.15.1",
      "websockets >= 13, < 16",
      "aiortc>=1.9.0",
      # Protobuf
      "protobuf",
      # explicit typing extensions
      "typing-extensions>=4.13",
  ]
  
  ### Optional dependencies
  [project.optional-dependencies]
  anthropic = [
      "anthropic ~= 0.32"
  ]
  autogen = [
      "autogen-agentchat >= 0.2, <0.4"
  ]
  aws = [
      "boto3>=1.36.4,<1.41.0",
  ]
  azure = [
      "azure-ai-inference >= 1.0.0b6",
      "azure-core-tracing-opentelemetry >= 1.0.0b11",
      "azure-search-documents >= 11.6.0b4",
      "azure-cosmos ~= 4.7"
  ]
  chroma = [
      "chromadb >= 0.5,< 1.1"
  ]
  copilotstudio = [
      "microsoft-agents-copilotstudio-client >= 0.3.1",
      "microsoft-agents-activity >= 0.3.1"
  ]
  dapr = [
      "dapr>=1.14.0",
      "dapr-ext-fastapi>=1.14.0",
      "flask-dapr>=1.14.0",
  ]
  faiss = [
      "faiss-cpu>=1.10.0"
  ]
  google = [
      "google-cloud-aiplatform == 1.97.0",
      "google-generativeai ~= 0.8"
  ]
  hugging_face = [
      "transformers[torch] ~= 4.28",
      "sentence-transformers >= 2.2,< 6.0",
      "torch == 2.8.0"
  ]
  mcp = [
      "mcp>=1.8",
  ]
  milvus = [
      "pymilvus >= 2.3,< 2.7",
      "milvus >= 2.3,<2.3.8; platform_system != 'Windows'"
  ]
  mistralai = [
      "mistralai >= 1.2,< 2.0"
  ]
  mongo = [
      "pymongo >= 4.8.0, < 4.15",
      "motor >= 3.3.2,< 3.8.0"
  ]
  notebooks = [
      "ipykernel ~= 6.29"
  ]
  ollama = [
      "ollama ~= 0.4"
  ]
  onnx = [
      "onnxruntime-genai ~= 0.7"
  ]
  pandas = [
      "pandas ~= 2.2"
  ]
  pinecone = [
      "pinecone[asyncio, grpc] ~= 7.0"
  ]
  postgres = [
      "psycopg[binary,pool] ~= 3.2"
  ]
  qdrant = [
      "qdrant-client ~= 1.9"
  ]
  redis = [
      "redis[hiredis] ~= 6.0",
      "types-redis ~= 4.6.0.20240425",
      "redisvl ~= 0.4"
  ]
  realtime = [
      "websockets >= 13, < 16",
      "aiortc>=1.9.0",
  ]
  sql = [
      "pyodbc >= 5.2"
  ]
  usearch = [
      "usearch ~= 2.16",
      "pyarrow >= 12.0,< 22.0"
  ]
  weaviate = [
      "weaviate-client>=4.10,<5.0,!=4.16.7",
  ]
  
  [tool.uv]
  prerelease = "if-necessary-or-explicit"
  dev-dependencies = [
      "pre-commit ~= 3.7",
      "ipykernel ~= 6.29",
      "nbconvert ~= 7.16",
      "pytest ~= 8.2",
      "pytest-xdist[psutil] ~= 3.6",
      "pytest-cov >= 5.0",
      "pytest-asyncio ~= 0.24",
      "pytest-timeout>=2.3.1",
      "snoop ~= 0.4",
      "mypy >= 1.10",
      "types-PyYAML ~= 6.0.12.20240311",
      "ruff ~= 0.9"
  ]
  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 = [
      'ignore:.*FunctionChoiceBehavior.*:DeprecationWarning'
  ]
  timeout = 120
  markers = [
      "ollama: mark a test as requiring the Ollama service (use \"not ollama\" to skip those tests)",
      "onnx: mark a test as requiring the Onnx service (use \"not onnx\" to skip those tests)"
  ]
  
  [tool.ruff]
  line-length = 120
  target-version = "py310"
  include = ["*.py", "*.pyi", "**/pyproject.toml", "*.ipynb"]
  preview = true
  
  [tool.ruff.lint]
  fixable = ["ALL"]
  unfixable = []
  select = [
      "D", #pydocstyle checks
      "E", #error checks
      "F", #pyflakes checks
      "I", #isort
      "CPY", #copyright
      "ISC", #implicit string concat
      "INP", #implicit namespace package
      "RSE", #raise exception parantheses check
      "RET", #flake8-return check
      "SIM", #flake8-simplify check
      "TD", #todos
      "FIX", #fixme checks
      "ERA", #remove connected out code
      "RUF" #RUF specific rules
  ]
  ignore = [
      "D100", #allow missing docstring in public module
      "D104", #allow missing docstring in public package
      "D418", #allow docstring on overloaded function
      "TD003", #allow missing link to todo issue
      "FIX002" #allow todo
  ]
  
  [tool.ruff.format]
  docstring-code-format = true
  
  [tool.ruff.lint.pydocstyle]
  convention = "google"
  
  [tool.ruff.lint.per-file-ignores]
  # Ignore all directories named `tests` and `samples`.
  "tests/**" = ["D", "INP", "TD", "ERA001", "RUF"]
  "samples/**" = ["D", "INP", "ERA001", "RUF"]
  # Ignore all files that end in `_test.py`.
  "*_test.py" = ["D"]
  "*.ipynb" = ["CPY", "E501"]
  
  [tool.ruff.lint.flake8-copyright]
  notice-rgx = "^# Copyright \\(c\\) Microsoft\\. All rights reserved\\."
  min-file-size = 1
  
  [tool.bandit]
  targets = ["semantic_kernel"]
  exclude_dirs = ["tests", "samples/demos/mcp_with_oauth"]
  
  [tool.flit.module]
  name = "semantic_kernel"
  
  [build-system]
  requires = ["flit-core >= 3.9,<4.0"]
  build-backend = "flit_core.buildapi"
  