[project]
name = "AstrBot"
version = "4.19.5"
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"
