[build-system] requires = ["setuptools>=77"] build-backend = "setuptools.build_meta" [project] name = "stuntd" version = "0.2.1" description = "Local proxy that learns your app's typed LLM decisions and answers them with a Laya head. Jev, OpenAI Decisions and OpenAI compatible." readme = "README.md" requires-python = ">=3.10" license = "Apache-2.0" authors = [{ name = "bladedevoff" }] keywords = ["llm", "llm-proxy", "jev", "typesafe", "system-one", "laya", "typed-decisions", "distillation", "openai-compatible", "local-inference", "self-hosted", "claude-code"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", ] dependencies = [ "anyio>=4", "starlette>=0.40", "uvicorn>=0.30", "httpx>=0.27", "tomli>=2.0; python_version < '3.11'", ] [project.optional-dependencies] dev = ["pytest>=8", "anyio>=4", "ruff>=0.6", "mypy>=1.10", "hypothesis>=6.100", "mutmut>=3", "pyright>=1.1.380", "typesafe-sdk>=0.7", "anthropic>=0.40"] train = ["laya>=0.3.4,<0.5"] jev = ["typesafe-sdk>=0.7"] [project.urls] Homepage = "https://github.com/bladedevoff/stuntd" Repository = "https://github.com/bladedevoff/stuntd" Issues = "https://github.com/bladedevoff/stuntd/issues" [project.scripts] stuntd = "stuntd.cli:main" [tool.setuptools] packages = ["stuntd", "stuntd.proxy", "stuntd.decisions", "stuntd.jev", "stuntd.oai", "stuntd.serve", "stuntd.store", "stuntd.train"] [tool.pytest.ini_options] testpaths = ["tests"] pythonpath = ["."] addopts = "-rXs --strict-config --strict-markers" markers = ["slow: real training on a local Laya checkpoint named by STUNTD_LAYA_MODEL or a stock encoder in the Hugging Face cache"] xfail_strict = true filterwarnings = [ "error", # laya 0.4 warns that the base checkpoint ships temperatures out of range; the tests use it as shipped. "ignore:laya. this checkpoint ships invalid temperatures:RuntimeWarning", ] [tool.ruff] line-length = 100 target-version = "py310" [tool.ruff.lint] select = ["E", "W", "F", "I", "B", "UP", "ASYNC", "PIE", "SIM", "C4", "RUF100"] ignore = ["B904", "E501"] [tool.ruff.lint.isort] combine-as-imports = true [tool.ruff.lint.per-file-ignores] "tests/*" = ["B018"] [tool.mypy] strict = true [[tool.mypy.overrides]] module = "tests.*" disallow_untyped_defs = false [[tool.mypy.overrides]] module = ["laya", "laya.*", "torch", "torch.*", "safetensors", "safetensors.*", "transformers", "transformers.*", "huggingface_hub", "huggingface_hub.*"] ignore_missing_imports = true # strict mode surfaces ~90 reportUnknown* findings outside the modules this task covers, # almost all from untyped dict access in decisions/proxy/settings and from laya/torch having no # type stubs; standard mode is the profile until those call sites carry their own annotations. [tool.pyright] include = ["stuntd"] typeCheckingMode = "standard" reportMissingImports = false reportMissingModuleSource = false [tool.mutmut] source_paths = ["stuntd/train/metrics.py", "stuntd/train/dataset.py", "stuntd/serve/monitor.py"] also_copy = ["stuntd", "tests"]