# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. [project] name = "ai-dynamo" version = "0.2.1" description = "Distributed Inference Framework" readme = "README.md" authors = [ { name = "NVIDIA Inc.", email = "sw-dl-dynamo@nvidia.com" }, ] license = { text = "Apache-2.0" } license-files = ["LICENSE"] requires-python = ">=3.10" dependencies = [ "pytest>=8.3.4", "bentoml==1.4.8", "types-psutil==7.0.0.20250218", "kubernetes==32.0.1", "ai-dynamo-runtime==0.2.1", "fastapi==0.115.6", "distro", "typer", "circus>=0.17.0", "sglang[all]==0.4.6.post2" ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "Intended Audience :: Information Technology", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Operating System :: POSIX :: Linux", ] keywords = ["llm", "genai", "inference", "nvidia", "distributed", "dynamo"] [project.urls] Repository = "https://github.com/ai-dynamo/dynamo.git" [project.optional-dependencies] all = [ "ai-dynamo-vllm~=0.8.4", "nixl", ] vllm = [ "ai-dynamo-vllm~=0.8.4" ] [project.scripts] dynamo = "dynamo.sdk.cli.cli:cli" dynamo-run = "dynamo.sdk.cli.run_executable:dynamo_run" llmctl = "dynamo.sdk.cli.run_executable:llmctl" http = "dynamo.sdk.cli.run_executable:http" metrics = "dynamo.sdk.cli.run_executable:metrics" mock_worker = "dynamo.sdk.cli.run_executable:mock_worker" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["deploy/sdk/src/dynamo", "components/planner/src/dynamo"] # This section is for including the binaries in the wheel package # but doesn't make them executable scripts in the venv bin directory [tool.hatch.build.hooks.custom] path = "hatch_build.py" [tool.codespell] # note: pre-commit passes explicit lists of files here, which this skip file list doesn't override - # this is only to allow you to run codespell interactively # this also overrides the grpc_generated folder, since it is generated # Ignore data files and auto-generated files skip = "./.git,./.github,./lib/llm/tests/data,*.lock,*.sum" # ignore allowed words used in code ignore-words-list = "afterall,ser,ende" # use the 'clear' dictionary for unambiguous spelling mistakes builtin = "clear" # use custom dictionary in addition to the built-in one dictionary = "./codespell.txt" # disable warnings about binary files and wrong encoding quiet-level = 3 [tool.isort] profile = "black" use_parentheses = true multi_line_output = 3 include_trailing_comma = true force_grid_wrap = 0 ensure_newline_before_comments = true line_length = 88 balanced_wrapping = true indent = " " skip = ["build"] known_first_party = ["dynamo"] [tool.pytest.ini_options] minversion = "8.0" tmp_path_retention_policy = "failed" # NOTE # We ignore model.py explcitly here to avoid mypy errors with duplicate modules # pytest overrides the default mypy exclude configuration and so we exclude here as well # Ignore mypy check for api-store component from Dynamo Deploy. Mypy analysis will fail since this package (and its dependencies) are not installed. addopts = [ "-ra", "--showlocals", "--strict-markers", "--strict-config", "--mypy", "--ignore-glob=*model.py", "--ignore-glob=*_inc.py", "--ignore-glob=deploy/cloud/api-store/*", # FIXME: Get relative/generic blob paths to work here ] xfail_strict = true log_cli_level = "INFO" filterwarnings = [ "error", "ignore:.*cuda*:DeprecationWarning", # Need this to avoid deprecation warnings from CUDA in tensorrt_llm. "ignore:.*pkg_resources.*:DeprecationWarning", "ignore:.*multipart.*:PendingDeprecationWarning" ] # NOTE: Can also manually mark tests with @pytest.mark.asyncio asyncio_mode = "auto" markers = [ "pre_merge: marks tests to run before merging", "nightly: marks tests to run nightly", "weekly: marks tests to run weekly", "gpu: marks tests to run on GPU" ] # Linting/formatting [tool.ruff] # Same as Black. line-length = 88 indent-width = 4 [tool.ruff.lint.extend-per-file-ignores] "icp/tests/**/test_*.py" = ["F811", "F401"] "*_inc.py" = ["F821"] [tool.mypy] # --disable-error-code: WAR large set of errors due to mypy not being run # previously. We can slowly enable sets of errors to fix over time. # disable_error_code = [] # --explicit-package-bases: WAR errors about duplicate module names used # throughout the llm examples. For example, the common module in # tensorrt_llm and vllm are both named common. explicit_package_bases = true # --ignore-missing-imports: WAR too many errors when developing outside # of container environment with PYTHONPATH set and packages installed. # NOTE: Can possibly move mypy from pre-commit to a github action run only in # a container with the expected environment and PYTHONPATH setup. ignore_missing_imports = true check_untyped_defs = true [[tool.mypy.overrides]] # Skip mypy analysis on internal dependencies of vllm module = ["vllm.*", "bentoml.*", "fs.*", "_bentoml_sdk.*"] follow_imports = "skip" ignore_missing_imports = true