# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
[project]
name = "ai-dynamo"
version = "1.7.0"
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.11"
dependencies = [
"ai-dynamo-runtime==1.7.0",
"aisimulate==0.13.0.dev202610240000000082 ; python_version >= '3.11' and python_version < '3.14'",
"aiohttp>=3.14.3,<4.0",
# Set the CA bundle floor for transitive HTTP clients outside containers too.
"certifi>=2026.10.23",
"transformers>=4.56.0",
"kubernetes>=32.0.1,<33.0.0",
"prometheus_client>=0.23.1,<1.0",
"msgspec>=0.19.0",
"redis>=6.2.0,<9.0.0",
"zstandard>=0.23.0,<1.0",
"pyzmq>=26.0.0",
"typing_extensions>=4.10.0",
"tqdm>=4.0.0",
]
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.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]
artifact-delivery = [
"opendal==0.47.10",
]
trtllm =[
"uvloop",
"tensorrt-llm==1.4.0rc0",
# tensorrt-llm declares an uncapped `mpmath>=1.3.0`; under `--pre` the resolver
# picks mpmath 1.5.0a0 (mpmath.libmp.bitcount removed) and backtracks sympy to
# the uncapped 1.14.0rc1, which still imports bitcount -> torch._dynamo dies at
# import (DYN-3348). Matches sympy 1.14's own cap; drop once TRT-LLM bounds mpmath.
"mpmath<1.4",
]
vllm = [
"uvloop",
"nixl[cu13]==1.5.0",
"vllm[flashinfer,runai,otel]==0.32.0",
# vllm-omni is not part of ai-dynamo[vllm]: container builds inherit the
# framework stack from vllm/vllm-openai, and pip/uv dependency resolution
# for omni can override the vLLM torch stack.
# "vllm-omni==...",
"blake3>=1.0.0,<2.0.0",
"soundfile>=0.13.1",
"librosa>=0.10.0",
"ray>=2.55.0",
]
sglang = [
"uvloop",
"sglang[diffusion]==0.5.22",
# sglang[diffusion] dropped accelerate in 0.5.12; diffusers still needs it.
"accelerate>=0.17.0",
"blake3>=1.0.0,<2.0.0",
"nixl[cu13]==1.5.0",
"cupy-cuda13x>=13.6.0",
]
[tool.uv]
# Some backend extras have incompatible transitive dependency requirements.
# Each conflict below identifies the dependency that prevents co-installation.
conflicts = [
# vLLM and SGLang have incompatible NIXL requirements.
[
{ extra = "vllm" },
{ extra = "sglang" },
],
# TensorRT-LLM and vLLM have incompatible flashinfer-python requirements.
[
{ extra = "trtllm" },
{ extra = "vllm" },
],
# SGLang and TensorRT-LLM have incompatible XGrammar requirements.
[
{ extra = "sglang" },
{ extra = "trtllm" },
],
]
[tool.uv.dependency-groups]
docs = { requires-python = ">=3.11" }
[project.entry-points."vllm.general_plugins"]
dynamo_nixl_telemetry = "dynamo.vllm.nixl_telemetry:allow_nixl_telemetry_capture"
[project.entry-points.pytest11]
vllm_tests = "dynamo.vllm.tests.conftest"
trtllm_tests = "dynamo.trtllm.tests.conftest"
triton_tests = "dynamo.triton.tests.conftest"
sglang_tests = "dynamo.sglang.tests.conftest"
[project.entry-points."aisimulate.sweep_config_providers"]
"dynamo.planner" = "dynamo.planner.simulation:create_provider"
"dynamo.router" = "dynamo.router.simulation:create_provider"
[project.entry-points."aisimulate.runner_factories"]
dynamo = "dynamo.replay.simulation:DynamoReplayRunnerFactory"
[project.entry-points."aisimulate.config_adapters"]
"dynamo.planner" = "dynamo.planner.simulation:create_provider"
"dynamo.router" = "dynamo.router.simulation:create_provider"
[project.entry-points."aisimulate.output_adapters"]
dgd = "dynamo.aisimulate.output.dgd:create_adapter"
[dependency-groups]
docs = [
# Core Sphinx
"sphinx>=8.1",
"nvidia-sphinx-theme>=0.0.8",
# Sphinx extensions
"ablog>=0.11",
"sphinx-copybutton>=0.5",
"sphinx-design>=0.6",
"sphinx-prompt>=1.9",
"sphinx-sitemap>=2.6",
"sphinx-tabs>=3.4",
"sphinx-book-theme>=1.1",
"sphinxcontrib-mermaid>=1.0",
"sphinxcontrib-bibtex>=2.6",
"sphinx-reredirects>=1.0.0",
# Markdown and notebook support
"myst-parser>=4.0",
"myst-nb>=1.2",
"nbsphinx>=0.9",
# Static Python API discovery for docs/fern/scripts/gen_python_api.py.
# Griffe parses the source tree without importing Dynamo, so the Fern
# docs build does not require the runtime, backends, or CUDA to be
# installed. Pytest and PyYAML are used by the focused tests under
# docs/fern/scripts/tests/ that exercise the generator and navigation.
"griffe==2.1.0",
"pytest>=8.0",
"pyyaml>=6.0",
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.hooks.custom]
path = "hatch_build.py"
[tool.hatch.build.targets.wheel]
packages = [
"components/src/dynamo",
]
[tool.hatch.metadata]
allow-direct-references = true
[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", "deploy"]
# isort may confuse what is 1st or 3rd library. e.g.
# when dynamo/vllm/omni/xx.py import vllm, local isort may treat this `vllm` as first
# party heuristically. This causes local sort differs from GitHub sort and pre-commit
# failure. To mitigate 1) one can install 3rd party lib so that isort is aware of it,
# 2) hardcode 3rd party lib here, 3) add "# isort: skip_file" to problematic files
# as the last resort.
known_third_party = ["vllm", "tensorrt_llm", "sglang", "tokenspeed", "aisimulate", "aisimulate_core"]
[tool.pytest.ini_options]
minversion = "8.0"
tmp_path_retention_policy = "failed"
# NOTE
# Keep these ignores in pytest collection to avoid duplicate-module collection
# errors (for example, backend trees that include multiple model.py files).
addopts = [
"-ra",
"--showlocals",
"--strict-markers",
"--strict-config",
"-p", "no:schemathesis",
"--ignore-glob=*model.py",
"--ignore-glob=*vllm_integration*",
"--ignore-glob=*trtllm_integration*",
"--ignore-glob=*kvbm/python/kvbm*",
"--ignore-glob=*_inc.py",
"--ignore-glob=*/llm/tensorrtllm*",
"--ignore-glob=docs/fern/*",
# Protocol compatibility tests have pinned tooling-only dependencies and run
# in their path-triggered unittest workflow. Generic runtime images do not
# install those dependencies, so do not collect this standalone suite there.
"--ignore-glob=scripts/protocol_compatibility/tests/*",
# power-agent ships a standalone suite run in-image (deploy/power-agent
# Dockerfile `test` stage + its own pytest.ini); its tests/ package name
# collides with the repo-root tests/ package during repo-wide collection.
"--ignore-glob=deploy/power-agent/tests/*",
"--ignore-glob=components/src/dynamo/sglang/request_handlers/*",
"--ignore-glob=components/src/dynamo/sglang/multimodal_utils/*",
"--ignore-glob=components/src/dynamo/vllm/multimodal_utils/*",
"--ignore-glob=examples/backends/sglang/slurm_jobs/*",
# FIXME: Get relative/generic blob paths to work here
]
xfail_strict = true
log_cli_level = "INFO"
filterwarnings = [
"error",
# kr8s 0.20.13 predates Kubernetes 1.36; keep its version warning visible
# without aborting deploy tests. Remove when the pinned release supports 1.36.
# Upstream coverage: https://github.com/kr8s-org/kr8s/pull/744
'default:^Kubernetes version v1\.36\.\d+ is not supported\. Supported versions for kr8s 0\.20\.13 are 1\.28 to 1\.34\.$:UserWarning:kr8s\._api$',
# DGDR still uses AISimulate's supported legacy sweep API until its
# migration to the new Sweeper API is implemented.
'ignore:`aisimulate\.sdk\.sweep\.sweep_(agg|disagg)\(\)` is a deprecated sweep API:DeprecationWarning',
# chardet 6.x is pulled in transitively but requests 2.32.x only supports chardet <6;
# charset_normalizer is used at runtime so the warning is benign.
"ignore:.*doesn't match a supported version",
# CUDA deprecation warnings from tensorrt_llm
"ignore:.*cuda*:DeprecationWarning",
# cuda.cudart/cuda.nvrtc deprecated in favor of cuda.bindings.* (cuda-python >=13)
# Triggered by flashinfer 0.6.7+ during import of comm/mnnvl.py
"ignore:The cuda\\..*module is deprecated:FutureWarning",
# nvidia-cutlass-dsl 4.8.0.dev0 moved names out of cutlass.utils and cutlass.arch.
# The TensorRT-LLM 1.3.0rc27 base image ships it where rc26 shipped 4.6.2, while
# flashinfer 0.6.18 is the same in both images and still reads the old locations,
# some of them in class-body annotations that run at import time. Those four
# warnings are every one that `import tensorrt_llm._torch.models` gains between
# the two images, and they fail the import under -W error.
"ignore:cutlass\\.utils\\..* is deprecated:DeprecationWarning",
"ignore:Arch from arch\\.py is deprecated:DeprecationWarning",
# SGLang GGUF quantization emits UserWarning on non-CUDA platforms (arm64 CPU-only CI)
"ignore:Only CUDA.*support GGUF quantization:UserWarning",
# SGLang still subclasses its deprecated MultiPlatformOp internally.
"ignore:MultiPlatformOp is deprecated; subclass sglang\\.kernels\\.fused_op\\.BaseFusedOp instead:DeprecationWarning",
# protobuf C extension warning
"ignore:.*PyType_Spec.*custom tp_new.*:DeprecationWarning",
# unclosed socket/event loop warnings
"ignore:.*unclosed.*socket.*:ResourceWarning",
"ignore:.*unclosed event loop.*:ResourceWarning",
# unraisable exception warnings
"ignore:.*Exception ignored in.*:pytest.PytestUnraisableExceptionWarning",
# pynvml deprecation, temporary until upstream migrates to nvidia-ml-py
"ignore:The pynvml package is deprecated.*:FutureWarning",
# Dynamo's own KV events deprecation warning
"ignore:Automatic KV events configuration is deprecated.*:FutureWarning",
# Python 3.12 SWIG extension warning from third-party tokenizer deps
"ignore:builtin type (SwigPyPacked|SwigPyObject|swigvarlink) has no __module__ attribute:DeprecationWarning",
# Pydantic V2 deprecation warnings from TRTLLM dependencies
"ignore:Support for class-based `config`.*:pydantic.warnings.PydanticDeprecatedSince20",
"ignore:Using extra keyword arguments on `Field`.*:pydantic.warnings.PydanticDeprecatedSince20",
"ignore:The `schema` method is deprecated.*:pydantic.warnings.PydanticDeprecatedSince20",
# Pydantic field shadowing in tensorrt_llm.serve.openai_protocol.ResponseFormat
'ignore:Field name "schema" in "ResponseFormat" shadows an attribute in parent:UserWarning',
# pytest-benchmark automatically disables when xdist is active
"ignore:.*Benchmarks are automatically disabled.*:pytest_benchmark.logger.PytestBenchmarkWarning",
# torchao invalid escape sequences in docstrings at import time
"ignore:.*invalid escape sequence.*:SyntaxWarning",
# torchao import path changes (https://github.com/pytorch/ao/issues/2752)
"ignore:Importing.*torchao\\.dtypes.*:DeprecationWarning",
# Triton CPU fallback warning on CPU-only runners
"ignore:Triton is not supported on current platform.*:UserWarning",
# torch.jit.script_method deprecation from torch.utils.mkldnn
"ignore:.*torch\\.jit\\.script_method.*is deprecated.*:DeprecationWarning",
# torch.jit.script deprecation from modelopt.torch.quantization
"ignore:`torch.jit.script` is deprecated:DeprecationWarning",
# nvidia-cutlass-dsl, transitive from flashinfer
"ignore:tcgen05\\..*is deprecated.*:DeprecationWarning",
# nvidia-modelopt warning about transformers version (transitive dep from TRT-LLM)
"ignore:transformers version .* is incompatible with nvidia-modelopt.*:UserWarning",
# SGLang quantization warnings on CPU-only runners
"ignore:Only CUDA, HIP and XPU support AWQ currently.*:UserWarning",
"ignore:Only CUDA support GGUF quantization currently.*:UserWarning",
# pandas 2.3 emits this from pd.concat on empty/all-NA frames; AISimulate hits it
# during disagg pareto search and re-raises as RuntimeError, breaking planner tests.
"ignore:The behavior of DataFrame concatenation with empty or all-NA entries is deprecated.*:FutureWarning",
# pandas 2.3 emits this from AISimulate pareto filtering under filterwarnings=error.
"ignore:Downcasting behavior in `replace` is deprecated.*:FutureWarning",
# pandas 2.3 emits this from the bundled compatibility report path on fillna.
"ignore:Downcasting object dtype arrays on .fillna.*:FutureWarning:aisimulate.legacy_cli.report_and_save",
# pandas 3.1 deprecates DataFrame.drop(inplace=...) with Pandas4Warning, a DeprecationWarning
# subclass; AISimulate still passes it in aisimulate.sdk.pareto_analysis, which picking calls.
"ignore:The inplace keyword in DataFrame.drop is deprecated.*:DeprecationWarning:aisimulate",
]
# NOTE: Can also manually mark tests with @pytest.mark.asyncio
asyncio_mode = "auto"
markers = [
"pre_merge: marks tests to run before merging",
"post_merge: marks tests to run after merge",
"parallel: marks tests that can run in parallel with pytest-xdist",
"defaulted: applied automatically by the repository-root conftest.py to a test that declared no lifecycle or hardware marker. Do not hand-apply it. The CPU parallel job selects it so defaulted tests do not pile into the sequential job, which runs the fault-tolerance suite in one process",
"nightly: marks tests to run nightly",
"skip_in_nightly: excludes a test from the nightly pipeline only (still runs in pre_merge/post_merge). Used via `not skip_in_nightly` in nightly-ci.yml marker filters",
"frontend_api_surface_compliance: marks tests that validate Dynamo's HTTP API surface (Responses/Anthropic wire shape, tool-call routing) against upstream compliance harnesses",
"token_budget_parity: compares native backend and Dynamo prompt/output overflow behavior",
"weekly: marks tests to run weekly",
"release: marks tests to run on release pipelines",
"gpu_0: marks tests that don't require GPU",
"gpu_1: marks tests to run on GPU",
"gpu_2: marks tests to run on 2GPUs",
"gpu_4: marks tests to run on 4GPUs",
"gpu_8: marks tests to run on 8GPUs",
"xpu_1: marks tests to run on XPU",
"xpu_2: marks tests to run on 2XPUs",
# These 6 (profiled_vram_gib and requested_*) are used for parallel pytest executions:
"profiled_vram_gib(N): actual peak VRAM observed by nvidia-smi during profiling. Used for --max-vram-gib filtering and scheduler budget tracking",
"requested_vllm_kv_cache_bytes(N): exact KV cache bytes for vLLM (skips memory profiling). Sets _PROFILE_PYTEST_KV_CACHE_BYTES. Most deterministic method for parallel execution",
"requested_sglang_kv_tokens(N): max KV cache tokens for SGLang parallel execution. Sets _OVERRIDE_SGLANG_MAX_TOTAL_TOKENS to cap --max-total-tokens and prevent over-allocation",
"requested_sglang_vram_gib(N): max VRAM in GiB for SGLang parallel execution. Use for non-text workloads (video/image diffusion) where token-based control doesn't apply",
"requested_trtllm_kv_tokens(N): max KV cache tokens for TensorRT-LLM parallel execution. Sets _PROFILE_OVERRIDE_TRTLLM_MAX_TOTAL_TOKENS to cap KvCacheConfig.max_tokens via --override-engine-args",
"requested_trtllm_vram_gib(N): max VRAM in GiB for TensorRT-LLM parallel execution. Sets _PROFILE_OVERRIDE_TRTLLM_MAX_GPU_TOTAL_BYTES to cap KvCacheConfig.max_gpu_total_bytes via --override-engine-args. Use for non-text workloads (video/image diffusion)",
"e2e: marks tests as end-to-end tests",
"integration: marks tests as integration tests",
"unit: marks tests as unit tests",
"wheel_smoke: marks tests that validate wheels copied from runtime images",
"installs_extra_dependencies: marks tests that pip-install a package the runtime image intentionally omits (via DYN_TEST_ONLY_PIP_INSTALL). The feature under test may not work in an unmodified shipped image",
"stress: marks tests as stress tests",
"performance: marks tests as performance tests",
"benchmark: marks tests as benchmark tests",
"none: marks tests that do not require a framework-specific runtime",
"core: marks tests that exercise core/runtime functionality",
"vllm: marks tests as requiring vllm",
"trtllm: marks tests as requiring trtllm",
"sglang: marks tests as requiring sglang",
"triton: marks tests as requiring triton",
"triton_qa: marks the Triton QA test suite",
"lmcache: marks tests as requiring lmcache",
"framework_agnostic: marks tests that inspect the container image itself; they carry framework markers for CI selection but need no framework module installed",
"multimodal: marks tests as multimodal (image/video) tests",
"slow: marks tests as known to be slow",
"h100: marks tests to run on H100",
"aiconfigurator: marks e2e tests that cover aiconfigurator functionality",
"mocker: marks tests for the mocker component",
"router: marks tests for router component",
"planner: marks tests for planner component",
"sidecar: marks tests that launch a Dynamo dynamo-*-sidecar binary against its native-gRPC engine via lib/sidecar/*/launch/*.sh",
"engine_ports: dynamo_dynamic_ports also allocates per-worker engine HTTP/gRPC ports, exported as DYN_ENGINE_{HTTP,GRPC}_PORT{N}",
"kvbm: marks tests for KV behavior and model determinism",
"kvbm_consolidator: marks KVBM consolidator/router integration tests",
"kvbm_determinism: marks KVBM model determinism tests",
"kvbm_concurrency: marks concurrency stress tests for KVBM (runs separately)",
"model: model id used by a test or parameter",
"custom_build: marks tests that require custom builds or special setup (e.g., MoE models)",
"k8s: marks tests as requiring Kubernetes",
"fault_tolerance: marks tests as fault tolerance tests",
"deploy: marks tests as deployment tests",
"framework_only: marks standard framework deployment tests (vllm, sglang, trtllm, triton)",
"framework_with_gaie: marks tests for GAIE (Gateway API Inference Extension) deployment",
"framework_with_efa: marks deployment tests that require an EFA-capable cluster and an -efa image",
"framework_with_kvcr: marks deployment tests that require a KVCR-capable image and multi-host RDMA",
"snapshot_restore: marks standalone Snapshot checkpoint/restore deployment tests",
"unified: marks common backend-interface e2e tests (BaseEngine + Worker)",
# Built-in markers
"skip: skip this test",
"skipif: skip if condition is true",
"xfail: expected failure",
"usefixtures: use fixtures",
"parametrize: parameterized test",
"filterwarnings: filter warnings",
"asyncio: asyncio test marker",
# Third-party plugin markers
"timeout: test timeout in seconds (pytest-timeout plugin)",
"flaky: rerun a flaky test on failure (pytest-rerunfailures plugin)",
]
# 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"]
# This is IDE (e.g. Cursor's default Python language server)
# Configure it so that developers can use "go-to-definition", "hover types" and other
# features.
[tool.basedpyright]
extraPaths = ["components/src", "lib/bindings/python/src"]
# This is for external dependencies.
venvPath = "."
venv = ".venv"
[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
check_untyped_defs = true
[[tool.mypy.overrides]]
# _version.py is generated at build time and does not exist in the source tree.
module = ["dynamo.*._version"]
ignore_missing_imports = true
[[tool.mypy.overrides]]
# Skip type checking for test files.
module = ["dynamo.*.tests.*", "dynamo.*.tests"]
ignore_errors = true
[[tool.mypy.overrides]]
# Manual planner helpers are operational scripts, not typed library surfaces.
module = ["dynamo.planner.manual.*"]
ignore_errors = true
[[tool.mypy.overrides]]
# AI Simulate is a separate, optional distribution. Load its types when it is
# installed without reporting errors that originate inside that distribution.
module = ["aisimulate", "aisimulate.*"]
follow_imports = "silent"
ignore_missing_imports = true
[[tool.mypy.overrides]]
# Skip mypy analysis on backend framework internals.
# ignore_missing_imports silences import-not-found only when the backend
# is not installed (e.g. sglang/trtllm missing in the vllm container).
module = ["vllm", "vllm.*"]
follow_imports = "skip"
ignore_missing_imports = true
[[tool.mypy.overrides]]
module = ["sglang", "sglang.*"]
follow_imports = "skip"
ignore_missing_imports = true
[[tool.mypy.overrides]]
module = ["tensorrt_llm", "tensorrt_llm.*"]
follow_imports = "skip"
ignore_missing_imports = true
[[tool.mypy.overrides]]
# PyNvVideoCodec: GPU-only NVDEC codec (common/multimodal/nvdec_decoder.py).
# Absent from the CPU lint env and ships no type stubs, so mypy would raise
# import-not-found on the guarded `import PyNvVideoCodec`.
module = ["PyNvVideoCodec", "PyNvVideoCodec.*"]
follow_imports = "skip"
ignore_missing_imports = true
[[tool.mypy.overrides]]
# OpenCV is optional and absent from the lint environment.
module = ["cv2", "cv2.*"]
follow_imports = "skip"
ignore_missing_imports = true
[[tool.mypy.overrides]]
# WAR mypy 1.18.x crash with numpy 1.26.x stubs:
# "Should never get here in normal mode, got TypeAlias:numpy.float64 instead of TypeInfo"
module = ["numpy", "numpy.*"]
follow_imports = "skip"
ignore_missing_imports = true
[[tool.mypy.overrides]]
# NumPy 2.3+ leaves np.empty() untyped when NumPy imports are skipped. Keep the
# existing realtime handler accepted without suppressing other error classes.
module = ["dynamo.vllm.realtime.handler"]
disable_error_code = ["var-annotated"]
[[tool.mypy.overrides]]
# Third-party libs without type stubs or optional internal deps
# TODO: fix the ones that do have stub package
module = [
"nvtx",
"fsspec",
"fsspec.*",
"zstandard",
"zstandard.*",
"kubernetes",
"kubernetes.*",
"scipy",
"scipy.*",
"sklearn",
"sklearn.*",
"pmdarima",
"pmdarima.*",
"filterpy",
"filterpy.*",
"prophet",
"prophet.*",
"nixl",
"nixl.*",
"imageio",
"imageio.*",
"prometheus_api_client",
"prometheus_api_client.*",
"aiohttp",
"aiohttp.*",
"vllm_omni",
"vllm_omni.*",
"modelexpress",
"modelexpress.*",
"kvbm",
"kvbm.*",
"diffusers",
"diffusers.*",
"torch",
"torch.*",
"transformers",
"transformers.*",
"cupy",
"cupy.*",
"gpu_memory_service",
"gpu_memory_service.*",
"pydantic",
"pydantic.*",
"uvloop",
"prometheus_client",
"prometheus_client.*",
"pybase64",
"blake3",
"cupy_backends",
"cupy_backends.*",
"huggingface_hub",
"huggingface_hub.*",
"httpx",
"httpx.*",
"zmq",
"zmq.*",
"safetensors",
"safetensors.*",
"kubernetes_asyncio",
"kubernetes_asyncio.*",
"ray",
"ray.*",
"pydantic_core",
"aisimulate",
"aisimulate.*",
"aisimulate_core",
"aisimulate_core.*",
"soundfile",
"soundfile.*",
"librosa",
"librosa.*",
]
ignore_missing_imports = true
[[tool.mypy.overrides]]
# msgspec.Struct uses custom __init_subclass__ kwargs (frozen, gc) that mypy
# cannot resolve without the msgspec package installed.
module = ["msgspec", "msgspec.*"]
follow_imports = "skip"
ignore_missing_imports = true
[[tool.mypy.overrides]]
# grpc / google.protobuf ship without type stubs in the dynamo-runtime image
# (grpc-stubs / types-protobuf are not pulled in by requirements.common.txt).
# The planner plugin transport imports grpc.aio + google.protobuf.message at
# module top — silence import-untyped errors there.
module = ["grpc", "grpc.*", "google.protobuf", "google.protobuf.*"]
follow_imports = "skip"
ignore_missing_imports = true
[[tool.mypy.overrides]]
# Profiler module was never previously type-checked and has many
# union-attr / attr-defined issues. Skip errors for now.
module = ["dynamo.profiler.*"]
ignore_errors = true
[tool.sphinx]
# extra-content-head
extra_content_head = [
'''
''',
]
#extra-content-footer
extra_content_footer = [
'''
''',
]