# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. [build-system] requires = ["setuptools>=45", "wheel"] build-backend = "setuptools.build_meta" [project] name = "sql_drift_env" version = "0.1.0" description = "SQLDrift: OpenEnv gym for repairing and optimizing SQL under live schema/business-rule drift" requires-python = ">=3.12,<3.14" dependencies = [ "duckdb>=1.5.2,<2.0", # huggingface-hub: floor must satisfy `transformers>=5.2.0` (which # needs hub>=1.3.0) — and the highest transformers we allow # (5.4.x–5.5.0) needs hub>=1.5.0. Pin the floor at 1.5.0 to match # the worst case so the [train] extra resolves cleanly. Cap <2.0 # because the `run_job` / `fetch_job_logs` / `inspect_job` API we # call in utilities/run_training_job.py landed in the 1.x line. "huggingface-hub>=1.5.0,<2.0", "openenv-core[core]>=0.2.2,<0.4", "sqlglot>=30.6.0,<40.0", "pydantic>=2.8.0,<3.0", "python-dotenv>=1.2.2,<2.0", "openai>=2.32.0,<3.0", ] [project.optional-dependencies] evidence = [ "matplotlib>=3.8.0,<4.0", "pandas>=2.0.0,<3.0", ] dev = [ "mypy>=1.20.1", "pytest>=9.0.3", "pytest-asyncio>=1.3.0", "pytest-cov>=7.0.0", "ruff>=0.15.11", "httpx>=0.28.0", ] train = [ # TRL-only stack — mirrors Hugging Face's reference notebooks for # GRPO with QLoRA (`grpo_trl_lora_qlora.ipynb`) and the OpenEnv # multi-turn tool-calling examples (`openenv_wordle_grpo.ipynb`). # No Unsloth: AutoModelForCausalLM + BitsAndBytesConfig is the # canonical path the TRL examples use, and it resolves cleanly # on a free Colab T4. "trl[peft]>=1.2.0,<2.0", "datasets>=3.0.0,<5.0", # TRL 1.2 floors transformers at >=5.0. Keep the ceiling open so # we follow the TRL release cadence. "transformers>=5.5.0", "accelerate>=1.13.0", "peft>=0.19", "bitsandbytes>=0.46.1,!=0.48.0", # jmespath: required by TRL's GRPOTrainer whenever `tools` or # `environment_factory` is used (parses tool-call responses from # the model). TRL raises ImportError at GRPOTrainer.__init__ # otherwise. Pure-Python, no transitive deps. # https://github.com/huggingface/trl/blob/main/trl/trainer/grpo_trainer.py "jmespath>=1.0,<2.0", "tensorboard>=2.20,<3.0", ] [project.scripts] # Flat package layout; see _cli.py. Runtime path: site-packages/sql_drift_env/ server = "sql_drift_env._cli:main" [tool.setuptools] include-package-data = true packages = [ "sql_drift_env", "sql_drift_env.scenarios", "sql_drift_env.engine", "sql_drift_env.skill_library", "sql_drift_env.actors", "sql_drift_env.training", "sql_drift_env.server", "sql_drift_env.utilities", ] [tool.setuptools.package-dir] "sql_drift_env" = "." "sql_drift_env.scenarios" = "scenarios" "sql_drift_env.engine" = "engine" "sql_drift_env.skill_library" = "skill_library" "sql_drift_env.actors" = "actors" "sql_drift_env.training" = "training" "sql_drift_env.server" = "server" "sql_drift_env.utilities" = "utilities" [tool.pytest.ini_options] testpaths = ["tests"] asyncio_mode = "auto" markers = [ "slow: marks tests as slow (excluded by default; run via `pytest -m slow`)", ] # Default excludes slow tests so CI stays on a fast path; run `pytest -m slow` for full suite. addopts = "-ra --strict-markers -m 'not slow'" [tool.ruff] line-length = 100 target-version = "py312" extend-exclude = [".venv", "design", "*.egg-info", "*.ipynb"] [tool.ruff.lint] select = ["E", "F", "I", "B", "UP", "SIM"] ignore = ["E501"] # Prefer fixing structure over scattered inline suppressions. See each rule in Ruff docs. [tool.ruff.lint.per-file-ignores] "_cli.py" = ["PLC0415"] "training/grpo_train.py" = ["PLC0415"] "engine/profiler.py" = ["BLE001"] "scenarios/__init__.py" = ["F401"] "tests/unit/test_p0_smoke.py" = ["F401"] "utilities/verbose_api_rollout.py" = ["E402"] "utilities/demo_rollout.py" = ["E402"] "tests/unit/test_drift_scenarios.py" = ["E402"] "tests/unit/test_profiler.py" = ["E402"] "tests/unit/test_drift.py" = ["E402"] "tests/unit/test_runtime.py" = ["E402"] [tool.mypy] python_version = "3.12" strict = true ignore_missing_imports = true explicit_package_bases = true mypy_path = "." files = [ "_cli.py", "actors", "client.py", "engine", "models.py", "scenarios", "utilities", "server", "skill_library", "training", ] exclude = [ "\\.venv", "design", ".*\\.egg-info", "tests", "build", "dist", ] # Subclasses in these modules call into openenv-core (no stubs). Relax only here. [[tool.mypy.overrides]] module = [ "client", "models", "engine.reward", "server.app", "server.sql_drift_env_environment", "training.grpo_train", ] disallow_subclassing_any = false warn_return_any = false [tool.coverage.run] # pytest-cov can hit upstream issues with beartype when tracing; run plain pytest for CI. source = ["engine", "scenarios", "skill_library", "actors", "models.py"] omit = ["tests/*", ".venv/*"] [tool.coverage.report] skip_empty = true exclude_lines = [ "pragma: no cover", "if __name__ == \"__main__\":", "if TYPE_CHECKING:", "raise NotImplementedError", "if 0:", "if False:", "\\.\\.\\.", ]