[project] name = "AstrBot" version = "4.20.0" description = "Easy-to-use multi-platform LLM chatbot and development framework" readme = "README.md" requires-python = ">=3.12" keywords = ["Astrbot", "Astrbot Module", "Astrbot Plugin"] dependencies = [ "aiocqhttp>=1.4.4", "aiodocker>=0.24.0", "aiohttp>=3.11.18", "aiosqlite>=0.21.0", "anthropic>=0.51.0", "apscheduler>=3.11.0", "beautifulsoup4>=4.13.4", "certifi>=2025.4.26", "chardet~=5.1.0", "loguru>=0.7.2", "cryptography>=44.0.3", "dashscope>=1.23.2", "defusedxml>=0.7.1", "deprecated>=1.2.18", "dingtalk-stream>=0.22.1", "docstring-parser>=0.16", "faiss-cpu>=1.12.0", "filelock>=3.18.0", "google-genai>=1.56.0", "lark-oapi>=1.4.15", "lxml-html-clean>=0.4.2", "mcp>=1.8.0", "openai>=1.78.0", "ormsgpack>=1.9.1", "pillow>=11.2.1", "pip>=25.1.1", "psutil>=5.8.0,<7.2.0", "py-cord>=2.6.1", "pydantic>=2.12.5", "pydub>=0.25.1", "pyjwt>=2.10.1", "python-telegram-bot>=22.6", "qq-botpy>=1.2.1", "quart>=0.20.0", "readability-lxml>=0.8.4.1", "silk-python>=0.2.6", "slack-sdk>=3.35.0", "sqlalchemy[asyncio]>=2.0.41", "sqlmodel>=0.0.24", "telegramify-markdown>=1.0.0", "watchfiles>=1.0.5", "websockets>=15.0.1", "wechatpy>=1.8.18", "audioop-lts ; python_full_version >= '3.13'", "click>=8.2.1", "pypdf>=6.1.1", "aiofiles>=25.1.0", "rank-bm25>=0.2.2", "jieba>=0.42.1", "markitdown-no-magika[docx,xls,xlsx]>=0.1.2", "xinference-client", "tenacity>=9.1.2", "shipyard-python-sdk>=0.2.4", "shipyard-neo-sdk>=0.2.0", "python-socks>=2.8.0", "packaging>=24.2", ] [dependency-groups] dev = [ "commitizen>=4.9.1", "pytest>=8.4.1", "pytest-asyncio>=1.1.0", "pytest-cov>=6.2.1", "ruff>=0.15.0", ] [project.scripts] astrbot = "astrbot.cli.__main__:cli" [tool.ruff] exclude = ["astrbot/core/utils/t2i/local_strategy.py", "astrbot/api/all.py", "tests"] line-length = 88 target-version = "py310" [tool.ruff.lint] select = [ "F", # Pyflakes "W", # pycodestyle warnings "E", # pycodestyle errors "ASYNC", # flake8-async "C4", # flake8-comprehensions "Q", # flake8-quotes "I", # import-order "UP", # pyupgrade # "SIM", # flake8-simplify ] ignore = [ "F403", "F405", "E501", "ASYNC230", # TODO: handle ASYNC230 in AstrBot "ASYNC240", # TODO: handle ASYNC240 in AstrBot ] [tool.pyright] typeCheckingMode = "basic" pythonVersion = "3.10" reportMissingTypeStubs = false reportMissingImports = false include = ["astrbot"] exclude = ["dashboard", "node_modules", "dist", "data", "tests"] [tool.hatch.metadata] allow-direct-references = true # Include bundled dashboard dist even though it is not tracked by VCS. [tool.hatch.build.targets.wheel] artifacts = ["astrbot/dashboard/dist/**"] # Custom build hook: builds the Vue dashboard and copies dist into the package. [tool.hatch.build.hooks.custom] path = "scripts/hatch_build.py" [build-system] requires = ["hatchling"] build-backend = "hatchling.build"