[project] name = "smart-support" version = "0.1.0" description = "AI customer support action-layer framework" requires-python = ">=3.11" dependencies = [ "fastapi>=0.115,<1.0", "uvicorn[standard]>=0.34,<1.0", "langgraph>=1.0,<2.0", "langgraph-supervisor>=0.0.30,<1.0", "langgraph-checkpoint-postgres>=3.0,<4.0", "langchain>=1.0,<2.0", "langchain-core>=1.0,<2.0", "langchain-anthropic>=1.0,<2.0", "langchain-openai>=1.0,<2.0", "langchain-google-genai>=2.1,<3.0", "psycopg[binary,pool]>=3.2,<4.0", "pydantic>=2.10,<3.0", "pydantic-settings>=2.7,<3.0", "pyyaml>=6.0,<7.0", "python-dotenv>=1.0,<2.0", "httpx>=0.28,<1.0", "openapi-spec-validator>=0.7,<1.0", ] [project.optional-dependencies] dev = [ "pytest>=8.3,<9.0", "pytest-asyncio>=0.25,<1.0", "pytest-cov>=6.0,<7.0", "httpx>=0.28,<1.0", "ruff>=0.9,<1.0", "pytest-httpx>=0.35,<1.0", ] [build-system] requires = ["setuptools>=75.0"] build-backend = "setuptools.build_meta" [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] markers = [ "unit: per-module isolated tests", "integration: cross-module with real PostgreSQL", "e2e: full-stack user flow tests", ] addopts = "--strict-markers" [tool.coverage.run] source = ["app"] [tool.coverage.report] fail_under = 80 show_missing = true [tool.ruff] target-version = "py311" line-length = 100 [tool.ruff.lint] select = ["E", "F", "I", "N", "W", "UP", "B", "A", "SIM", "TCH"] [tool.ruff.lint.per-file-ignores] "tests/**" = ["N806", "B017"] [tool.ruff.format] quote-style = "double"