[project]
name = "a-share-research"
version = "0.1.0"
description = "A 股 Deep Research 私有投研平台"
readme = "README.md"
requires-python = ">=3.11,<3.12"
authors = [
    { name = "summer" }
]
license = { text = "Proprietary" }

# 注意:依赖按 Milestone 分阶段加入,避免一次性引入。
# 当前已启用:M1 抓取层
dependencies = [
    "pydantic>=2.7",
    "pyyaml>=6.0",
    "python-dotenv>=1.0",
    "loguru>=0.7",
    # ---- M1 抓取层 ----
    "crawl4ai>=0.6,<0.8",
    "tenacity>=9.0",
    "beautifulsoup4>=4.12",
    # ---- M2 正文提取 ----
    "gne>=0.3",
    "python-dateutil>=2.9",
    "lxml>=5.0",
    # ---- M4 LLM 投资事件抽取 ----
    "openai>=1.40",
    "httpx>=0.27",
    # ---- M5 Embedding(远程后端必装,本地后端走 optional)----
    "numpy>=1.26",
    # ---- M6 Qdrant 向量库 ----
    "qdrant-client>=1.10",
    # ---- M7 定时任务 ----
    "apscheduler>=3.10",
    # ---- M8 MCP 服务 ----
    "mcp>=1.0",
    "pypdf>=6.13.3",
    "markitdown[all]>=0.1.5",
    "pymysql>=1.2.0",
]

[project.optional-dependencies]
# 本地 BGE-M3 后端:首次下载约 2.3 GB,按需安装
# uv sync --extra local-embedding
local-embedding = [
    "sentence-transformers>=3.0",
    "torch>=2.2",
]
# 占位,后续 Milestone 按需启用
# mcp = ["mcp>=1.0"]

[dependency-groups]
dev = [
    "pytest>=8.0",
    "pytest-asyncio>=0.23",
    "pytest-cov>=5.0",
    "ruff>=0.5",
    "mypy>=1.10",
]

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.hatch.build.targets.wheel]
packages = [
    "crawler",
    "extractor",
    "dedup",
    "llm",
    "embedding",
    "vectorstore",
    "scheduler",
    "mcp_server",
    "api",
]

[project.scripts]
a-share = "a_share_cli.main:main"

[tool.ruff]
line-length = 100
target-version = "py311"

[tool.ruff.lint]
select = ["E", "F", "W", "I", "N", "UP", "B", "C4", "SIM"]
ignore = ["E501"]

[tool.pytest.ini_options]
testpaths = ["tests"]
asyncio_mode = "auto"
addopts = "-ra -q"
markers = [
    "integration: 需要真实网络/浏览器的集成测试,默认跳过",
]

[tool.mypy]
python_version = "3.11"
strict = false
ignore_missing_imports = true
