content: [project]
  name = "lminference-fall2025-code"
  version = "0.1.0"
  description = "Educational code examples and tutorials for CMU Language Model Inference (Fall 2025)"
  readme = "README.md"
  requires-python = ">=3.10,<3.13"
  authors = [
    { name = "Graham Neubig", email = "gneubig@cs.cmu.edu" }
  ]
  license = { file = "LICENSE" }
  keywords = ["nlp", "llm", "education", "inference", "cmu"]
  
  # Main runtime dependencies used across notebooks/scripts
  # Keep versions reasonably recent but flexible
  dependencies = [
    "torch>=2.2",
    "transformers>=4.41",
    "matplotlib>=3.7",
    "seaborn>=0.12",
    "numpy>=1.25",
    "pandas>=2.0",
    "jupytext>=1.16",
    "tiktoken>=0.11.0",
    "litellm>=1.76.0",
    "python-dotenv>=1.1.1",
  ]
  
  [project.optional-dependencies]
  # Developer tooling (kept for compatibility when installing extras via pip)
  dev = [
    "ruff>=0.5.0",
    "pyright>=1.1.365",
    "pre-commit>=3.7",
  ]
  
  # uv-specific dev dependency group for `uv sync --group dev`
  [dependency-groups]
  dev = [
    "ruff>=0.5.0",
    "pyright>=1.1.365",
    "pre-commit>=3.7",
  ]
  
  [tool.ruff]
  line-length = 120
  # Keep target version modern but compatible with Colab
  target-version = "py310"
  extend-exclude = [
    ".git",
    ".github",
    ".venv",
    "**/.venv/**",
    "**/__pycache__/**",
    "**/.ipynb_checkpoints/**",
    "**/*.ipynb",
  ]
  
  [tool.ruff.lint]
  # Enforce style, unused/inline imports, annotations, and modern typing
  select = ["E", "F", "UP", "ANN"]
  ignore = [
    # Keep pragmatic line length and allow a few narrative conveniences
    "E501",
    "F841",
    # Allow f-strings without placeholders used for formatting consistency
    "F541",
    # Do not require annotating self/cls parameters
    "ANN101",
    "ANN102",
  ]
  
  [tool.ruff.lint.flake8-annotations]
  # Require return annotation for __init__ and ignore self/cls params
  mypy-init-return = true
  suppress-dummy-args = true
  
  [tool.pyright]
  pythonVersion = "3.10"
  include = ["."]
  exclude = [
    ".git",
    ".github",
    "**/__pycache__",
    "**/.ipynb_checkpoints",
    "**/*.ipynb",
    ".venv",
    "**/.venv/**",
  ]
  # Keep type checking lenient for educational notebooks
  typeCheckingMode = "basic"
  useLibraryCodeForTypes = true
  reportMissingImports = "warning"
  reportMissingTypeStubs = "none"
  # Suppress attribute access issues common in narrative/monkey-patched code
  reportAttributeAccessIssue = "none"
  
  [tool.markdownlint]
  # Markdownlint configuration for educational content
  default = true
  MD033 = false  # Allow inline HTML (useful for badges, etc.)
  MD041 = false  # Allow files to not start with H1 (some have badges first)
  MD012 = false  # Allow multiple consecutive blank lines for readability
  
  [tool.markdownlint.MD013]
  line_length = 120  # Allow longer lines for URLs and code blocks
  