content: [build-system]
  requires = ["hatchling"]
  build-backend = "hatchling.build"
  
  [project]
  name = "mbodied"
  dynamic = ["version"]
  description = 'Embodied AI'
  readme = "README.md"
  requires-python = ">=3.10"
  license = "apache-2.0"
  keywords = []
  authors = [{ name = "Mbodi Team", email = "info@mbodi.ai" }]
  classifiers = [
    "Development Status :: 4 - Beta",
    "Programming Language :: Python",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: Implementation :: CPython",
    "Programming Language :: Python :: Implementation :: PyPy",
  ]
  
  dependencies = [
    "anthropic",
    "art",
    "backoff",
    "chromadb",
    "datasets",
    "google-genai",
    "gymnasium",
    "h5py",
    "jsonref",
    "numpy>=1.26.4",
    "openai",
    "pillow",
    "pydantic",
    "gradio",
    "gradio_client",
    "rich-click>=1.8.3",
    "compress-pickle>=2.1.0",
    "ruamel-yaml>=0.18.6",
  ]
  [project.optional-dependencies]
  extras = ["xarm-python-sdk", "opencv-python", "torch", "transformers"]
  audio = ["pyaudio", "openai-whisper"]
  all = [
    "xarm-python-sdk",
    "opencv-python",
    "torch",
    "transformers",
    "pyaudio",
    "openai-whisper",
    "open3d",
    "timm",
    "torchvision",
    "wandb",
  ]
  [project.urls]
  Documentation = "https://github.com/mbodiai/embodied-agents#readme"
  Issues = "https://github.com/mbodiai/embodied-agents/issues"
  Source = "https://github.com/mbodiai/embodied-agents"
  
  [project.scripts]
  mbodied = "mbodied.agents.cli:cli"
  
  [tool.hatch.version]
  path = "mbodied/__about__.py"
  
  [tool.hatch.metadata]
  allow-direct-references = true
  
  [tool.hatch.build]
  exclude = ["assets/**"]
  
  [tool.hatch.build.targets.wheel.force-include]
  "resources" = "mbodied/resources"
  
  [tool.hatch.envs.default]
  python = "3.11"
  path = ".mbodied/envs/mbodied"
  dependencies = ["pytest", "pytest-mock", "pytest-asyncio"]
  
  [tool.hatch.envs.default.env-vars]
  [tool.hatch.envs.conda]
  type = "conda"
  python = "311"
  command = "conda"
  conda-forge = false
  environment-file = "environment.yml"
  prefix = ".venv/"
  
  [tool.hatch.envs.default.scripts]
  test = "pytest -vv --ignore third_party {args:tests}"
  test-cov = "coverage run -m pytest {args:tests}"
  cov-report = ["- coverage combine", "coverage report"]
  cov = ["test-cov", "cov-report"]
  
  [[tool.hatch.envs.all.matrix]]
  python = ["3.10", "3.11", "3.12"]
  
  [tool.hatch.envs.types]
  dependencies = ["mypy>=1.0.0"]
  [tool.hatch.envs.types.scripts]
  check = "mypy --install-types --non-interactive {args:mbodied/ tests}"
  
  [tool.coverage.run]
  source_pkgs = ["mbodied", "tests"]
  branch = true
  parallel = true
  omit = ["mbodied/__about__.py"]
  
  [tool.coverage.paths]
  mbodied = ["mbodied/"]
  tests = ["tests"]
  
  [tool.coverage.report]
  exclude_lines = ["no cov", "if __name__ == .__main__.:", "if TYPE_CHECKING:"]
  
  [tool.ruff]
  line-length = 120
  indent-width = 4
  target-version = "py311"
  
  [tool.ruff.lint]
  extend-unsafe-fixes = ["ALL"]
  # List of rules: https://docs.astral.sh/ruff/rules
  select = [
    # flake8-builtins
    "A",
    # flake8-commas
    "COM812",
    # flake8-comprehensions
    "C4",
    # pydocstyle
    "D",
    # pycodestyle
    "E",
    # Pyflakes
    "F",
    # pyupgrade
    "UP",
    # flake8-bugbear
    "B",
    # flake8-simplify
    "SIM",
    # flake8-implicit-str-concat
    "ISC",
    # pep8-naming
    "N",
    # flake8-annotations
    "ANN",
    # flake8-async
    "ASYNC",
    # flake8-bandid selected
    "S",
    # flake8-print
    "T20",
    # flake8-return
    "RET",
    # flake8-simplify
    "SIM",
    # flake8-unused-arguments
    "ARG",
    # flake8-use-pathlib
    "PTH",
    # eradicate
    "ERA",
    # pandas-vet
    "PD",
    # Import sort
    "I",
    # avoid shadowing
    "PLW",
  ]
  ignore = [
    "D100",
    "D101",
    "D104",
    "D106",
    # missing-type-self
    "ANN101",
    # missing-type-cls
    "ANN102",
    # missing-type-kwargs
    "ANN003",
    # utf-8 encoding skip
    "UP009",
    # Missing return type annotation for special method `__init__`
    "ANN204",
    # Star-arg unpacking after a keyword argument is strongly discouraged
    "B026",
    # Missing type annotation for function argument `self`
    "ANN001",
    # Dynamically typed expressions (typing.Any) are disallowed in `wrapper`
    "ANN401",
    # We don't need docstrings for every method
    "ANN202",
    "D107",
    "D102",
    "D103",
    # Inline lambdas
    "E731",
    # Sometimes we need List and Tuple
    "UP006",
    "UP035",
    "ANN002",
  ]
  
  # Allow fix for all enabled rules (when `--fix`) is provided.
  fixable = ["ALL"]
  unfixable = []
  
  [tool.ruff.format]
  docstring-code-format = true
  quote-style = "double"
  # Like Black, indent with spaces, rather than tabs.
  indent-style = "space"
  # Like Black, respect magic trailing commas.
  skip-magic-trailing-comma = false
  # Like Black, automatically detect the appropriate line ending.
  line-ending = "auto"
  
  [tool.uv]
  dev-dependencies = [
    "perftest>=0.0.2",
    "pytest-asyncio>=0.24.0",
    "pytest-mock>=3.14.0",
    "pytest>=8.3.3",
  ]
  
  [tool.ruff.lint.pydocstyle]
  convention = "google"
  
  [tool.ruff.lint.per-file-ignores]
  "**/{tests,docs}/*" = ["ALL"]
  "**__init__.py" = ["F401"]
  