[project] name = "backend" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.11,<3.12" dependencies = [ "pip>=23.0", "camel-ai[eigent]==0.2.91a3", "fastapi>=0.115.12", "fastapi-babel>=1.0.0", "uvicorn[standard]>=0.34.2", "pydantic-i18n>=0.4.5", "python-dotenv>=1.1.0", "httpx[socks]>=0.28.1", "pydash>=8.0.5", "inflection>=0.5.1", "aiofiles>=24.1.0", "openai>=1.99.3,<2", "nodejs-wheel>=22.18.0", "numpy>=1.23.0,<2.0.0", "debugpy>=1.8.17", "qdrant-client>=1.16.2", "opentelemetry-api>=1.34.1", "opentelemetry-sdk>=1.34.1", "opentelemetry-exporter-otlp-proto-http>=1.34.1", ] [dependency-groups] dev = [ "babel>=2.17.0", "pre-commit>=4.0.0", "pytest>=8.4.1", "pytest-asyncio>=1.1.0", ] [tool.ruff] line-length = 79 target-version = "py311" exclude = ["benchmark/answer"] [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes (unused imports, variables, etc.) "I", # isort (import sorting) "UP", # pyupgrade (Python syntax upgrades) "B", # flake8-bugbear ] ignore = [ "E402", # module level import not at top of file (needed for path setup) "E501", # line too long (handled by formatter) "E712", # == False comparisons (needed for SQLAlchemy) "B904", # raise from - too many existing violations "B023", # closure captures loop variable - existing pattern "B017", # blind except in tests - acceptable "B905", # zip strict - existing code doesn't use strict parameter ] [tool.ruff.lint.isort] force-single-line = false combine-as-imports = true [tool.ruff.lint.per-file-ignores] "**/tests/**" = ["F841"] # unused variables OK in tests [tool.ruff.format] quote-style = "double" indent-style = "space" [tool.bandit] exclude_dirs = ["tests", ".venv", "venv", "benchmark/answer"] skips = [ "B101", # assert_used - OK in non-production code "B105", # hardcoded_password_string - false positive on env var names "B110", # try_except_pass - used intentionally for error suppression "B113", # request_without_timeout - handled by httpx defaults "B311", # random - OK for non-crypto use "B404", # import subprocess - needed for process management "B603", # subprocess_without_shell - shell=False is safer "B607", # start_process_with_partial_path - acceptable for system cmds ] [tool.pytest.ini_options] testpaths = ["tests"] pythonpath = ["."] python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"]